如何使用 DT 包 upload/import 新 R 闪亮版本 0.12 中的文件

How to upload/import a file in the new R shiny version 0.12 using DT package

我刚把shiny更新到0.12版本,开始使用DT包(觉得有点难用,但还是得用)。基本上我正在尝试上传或导入文件。这是我的服务器代码:

 shinyServer(function(input, output, session) {

    datasetInput <- reactive({
      infile <- input$FileInput
      if(is.null(infile))
        return(NULL)
      read.table(infile$datapath,header=input$header,sep=input$sep,check.names=F)
    })

    output$table = DT::renderDataTable(datasetInput(), server = TRUE)
    })

    # Also tried the following code but get the same error & warning:
    # output$table <- DT::renderDataTable({
    #    DT::datatable(datasetInput())
    # },server=TRUE)

这是我遇到的错误:

Error in datatable(instance, ...) : 
  'data' must be either a matrix or a data frame

和以下警告,尽管使用 server = TRUE:

Warning in run(timeoutMs) :
  It seems your data is too big for client-side DataTables. You may consider server-side processing: http://rstudio.github.io/DT/server.html 

我知道这是非常基础的,我找不到任何使用 DT 包从文件导入数据的示例。肯定会弹出更多问题,因为我才刚刚开始将所有内容从 0.11 移动到 0.12。

你的代码没问题。您确定已更新到绝对最新的 shinyDT 吗?它们在过去几周都进行了相当大的更新,因此请确保安装它们的 GitHub 版本。我猜其中一个软件包不是最新的。请注意,对于新版本,您无需指定 server = TRUE,因为这是新的默认值。

这是我刚刚使用的代码,我能够读取文件并显示它。这是您代码的简化,因为我不想实现 header 和 sep 输入。下次请包括完整的源代码,包括 UI 以使我们更容易和更可重现:)

runApp(shinyApp(
  ui = fluidPage(
    fileInput("FileInput", "Choose file"),
    DT::dataTableOutput("table")
  ),
  server = function(input, output, session) {
    datasetInput <- reactive({
      infile <- input$FileInput
      if(is.null(infile))
        return(NULL)
      read.csv(infile$datapath, header = TRUE)
    })

    output$table = DT::renderDataTable(datasetInput())
  }
))

请注意,我最初确实看到 'data' must be either a matrix or a data frame 消息,但在选择文件后它消失了。这是因为数据表正在尝试使用 NULL 值进行初始化,这显然会引发该错误(我认为它不应该静默显示任何内容而不是出现错误,但事实就是如此)。要解决这个小问题,只需将 reactive 更改为 eventReactive,这样它只会在选择文件后触发

runApp(shinyApp(
  ui = fluidPage(
    fileInput("FileInput", "Choose file"),
    DT::dataTableOutput("table")
  ),
  server = function(input, output, session) {
    datasetInput <- eventReactive(input$FileInput, {
      infile <- input$FileInput
      read.csv(infile$datapath, header = TRUE)
    })

    output$table = DT::renderDataTable(datasetInput())
  }
))