我刚刚更新了版本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。
答案 0 :(得分:4)
你的代码很好。您确定已更新为绝对最新shiny
和DT
吗?在过去的几周里,它们都进行了大量更新,因此请确保安装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())
}
))