如何使用DT包在新的R版本0.12中上传/导入文件

时间:2015-06-04 15:56:19

标签: r datatable upload 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。

1 个答案:

答案 0 :(得分:4)

你的代码很好。您确定已更新为绝对最新shinyDT吗?在过去的几周里,它们都进行了大量更新,因此请确保安装GitHub版本。我猜其中一个包不是最新的。请注意,使用新版本时,您无需指定server = TRUE,因为这是新的默认值。

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

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())
  }
))