我希望有一个基于另一个表的数据表显示信息,下面有一行numericInputs。我正在尝试将numericInput框显示在表中,以便用户可以键入值,然后在准备好时按提交。
在我添加R Shiny selectedInput inside renderDataTable cells的numericInput代码之前,这是有效的。但是我收到一条错误消息:
[AAA]
[BBB]
[CCC]
[DDD]
ShinyApp可重现的代码:
Warning: Error in force: argument "value" is missing, with no default
Stack trace (innermost first):
49: force
48: restoreInput
47: FUN
46: shinyInput [#34]
45: server [#53]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
Error in force(default) : argument "value" is missing, with no default
答案 0 :(得分:0)
您尝试适应的解决方案可能存在一些误解。
首先,你得到的错误是微不足道的,但不知何故被包装函数掩盖了。标记numericInput
需要一个参数value
,这不是可选的。您未在shinyInput
的电话中提供此信息。 (它是您引用的...
的一部分。)
更正,您收到错误
Error : (list) object cannot be coerced to type 'double'
这是因为,在shinyInput
内要转换为数字。在这里你误解了你链接的帖子。 shinyInput
的作用是:它创建了许多特定于闪亮的网页元素,而这些元素又可以打包到您的表格中。但是,由于这些Web元素不仅仅是HTML(包括依赖项),您还希望将它们转换为纯HTML。这就是为什么在链接帖子中,作者使用了as.character
。这与您希望窗口小部件提供的输入类型无关。所以,as.numeric
在这里是错误的。
由于我们要向data.frame
添加HTML,我们将要包含在renderDataTable
中,我们必须指定escape = FALSE
,以便我们的HTML实际上被解释为HTML而不是转换成无聊的文字。 (也纠正了此调用中的一些语法。)
现在,您至少可以正确显示输入字段。
library(shiny)
library(DT)
data(mtcars)
if (interactive()) {
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fluidRow(
column(6, checkboxGroupInput("dsnamesGrp", "Variable name")),
column(6, uiOutput("dsordsGrp"), inline= FALSE)
)
),
mainPanel(
tabsetPanel(
tabPanel("contents", DT::dataTableOutput('contents')),
tabPanel("binnedtable", DT::dataTableOutput('binnedtable'))
),
DT::dataTableOutput('interface_table'),
actionButton("do", "Apply")
)
)
)
server <- function(input, output, session) {
output$contents <- DT::renderDataTable(mtcars,
rownames = FALSE,
options = list(
autoWidth = TRUE,
scrollX = TRUE,
dom = 't',
ordering = FALSE
)
)
# helper function for making input number values
shinyInput <- function(FUN, len, id, ...) {
inputs <- numeric(len)
for (i in seq_len(len)) {
# as.character to make a string of HTML
inputs[i] <- as.character(FUN(paste0(id, i), label = NULL, ...))
}
inputs
}
# helper function for reading numeric inputs
shinyValue <- function(id, len) {
unlist(lapply(seq_len(len), function(i) {
value <- input[[paste0(id, i)]]
if (is.null(value)) NA else value
}))
}
temp_m <- matrix(data = NA, nrow = 2, ncol = length(names(mtcars)))
colnames(temp_m) <- names(mtcars)
rownames(temp_m) <- c("Ordinality","Bins")
temp_m[1,] <- lengths(lapply(mtcars, unique))
bin_value <- list() #tags$input(bin_value)
# Since numericInput needs a value parameter, add this here!
temp_m[2,] <- shinyInput(numericInput, ncol(mtcars), "bin_values", value = NULL)
output$interface_table <- DT::renderDataTable(temp_m,
colnames = names(mtcars),
rownames = FALSE,
# Important, so this is not just text, but HTML elements.
escape = FALSE,
options = list(
autoWidth = TRUE, scrollX = TRUE, dom = 't',
ordering = FALSE)
)
}
}
shinyApp(ui, server)