在数据表行中渲染numericInputs

时间:2018-01-01 01:25:40

标签: r datatable shiny

我希望有一个基于另一个表的数据表显示信息,下面有一行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

1 个答案:

答案 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)