如何使用 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。
你的代码没问题。您确定已更新到绝对最新的 shiny
和 DT
吗?它们在过去几周都进行了相当大的更新,因此请确保安装它们的 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())
}
))
我刚把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。
你的代码没问题。您确定已更新到绝对最新的 shiny
和 DT
吗?它们在过去几周都进行了相当大的更新,因此请确保安装它们的 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())
}
))