我使用Shiny和DT包来显示MySQL数据库中的过滤表。
简而言之,我从用户那里获得一个输入值,创建一个SQL查询,捕获输出并将其显示为DataTable。可以使用DataTable列过滤器进一步过滤输出,用户应该能够下载过滤后的数据集。
根据DT docs,input$table_rows_all
应包含所显示表格的行索引。
但是,当我按下下载按钮时,我得到一个只有列名而没有数据的文件。
library(shiny)
library(DT)
library(RMySQL)
con <- dbConnect(MySQL(), user="myuser", host="myhost", dbname="mydb")
shinyServer(function(input, output) {
sqlOutput <- reactive({
sqlInput <- paste0("select * from mydb.mytable",
" where value < ", input$value,
";")
dbGetQuery(con, sqlInput)
})
output$table <- DT::renderDataTable(sqlOutput(), server=TRUE, rownames=FALSE, filter="top", options=list(pageLength=10))
output$download <- downloadHandler("filtered.data.txt", content = function(file) {
rows <- input$table_rows_all
write.table(sqlOutput()[rows, ], file, sep="\t", quote=FALSE, col.names=TRUE, row.names=FALSE)
})
})
在上面的代码中,我将DBI::dbQuery()
的输出保存到反应函数sqlOutput()
中,以便我可以将其传递给DT::renderDataTable()
和shiny::downloadHandler()
。
我做错了什么?我不确定,但看起来input$table_rows_all
由于某种原因返回空向量。
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
您的示例不是真正可重现的,但如果您只是希望能够使用DT
从闪亮的下载生成的表格,我会查看DT extensions。在那里,您可以看到您可以使用tableTools
来选择下载,而不是使用手册downloadHandler
。
以下是展示功能的可重现示例:
注意 - 您需要在浏览器中安装www
目录和flash
。
library(shiny)
library(DT)
data(iris)
runApp(list(
ui = fluidPage(
sidebarLayout(
sidebarPanel("DT Download Example"),
mainPanel(
DT::dataTableOutput("mytable")
)
)
),
server = function(input, output) {
output$mytable <- DT::renderDataTable({
iris
},
extensions = 'TableTools',
rownames=FALSE,
filter="top",
options=list(dom = 'T<"clear">lfrtip',
tableTools = list(
sSwfPath = copySWF('www'),
aButtons = list('copy', 'print',
list(
sExtends = 'collection',
sButtonText = 'Save',
aButtons = c('csv','xls')
)
)
)
)
)
}))
以下是代码中相关部分的未经测试版本:
output$table <- DT::renderDataTable({
sqlOutput()
}, server=TRUE,
extensions = 'TableTools',
rownames=FALSE,
filter="top",
options=list(pageLength=10,
dom = 'T<"clear">lfrtip',
tableTools = list(
sSwfPath = copySWF('www'),
aButtons = list('copy', 'print',
list(
sExtends = 'collection',
sButtonText = 'Save',
aButtons = c('csv','xls'))))))