【问题标题】:How to upload/import a file in the new R shiny version 0.12 using DT package如何使用 DT 包在新的 R 闪亮版本 0.12 中上传/导入文件
【发布时间】:2015-08-19 08:18:13
【问题描述】:

我刚刚将 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。

【问题讨论】:

    标签: r datatable upload shiny


    【解决方案1】:

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

    这是我刚刚使用的代码,我能够读取文件并显示它。这是您代码的简化,因为我不想实现标头和 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())
      }
    ))
    

    【讨论】:

    • 我正在使用DT_0.0.64shiny_0.12.0。我会尝试安装 GitHub 版本并查看错误是否消失。
    • 这些实际上是最新版本。为了确保我们做的事情完全相同,为什么不尝试在 iris 数据上运行我的代码(第二个版本,没有初始错误的那个)。只需运行 write.csv(iris, "iris.csv") 将 iris 表写入文件,然后使用我的代码加载同一个文件。它应该可以工作。
    • 实际上,我刚刚使用 GitHub 版本(shiny_0.12.0.9002)更新了闪亮,并且我的代码有效。非常感谢您指出这一点!
    • 请注意,看起来 NULL 问题刚刚在一小时前修复 - github.com/rstudio/DT/issues/92 所以现在您也可以使用我的代码的第一个版本而不会出错跨度>
    猜你喜欢
    • 2020-02-03
    • 2020-10-18
    • 2019-12-06
    • 2015-05-16
    • 2016-03-30
    • 2017-05-05
    • 2016-01-02
    • 2013-06-26
    • 2017-07-25
    相关资源
    最近更新 更多