好吧,我在@Pork Chop建议之后修改了脚本:
server.R
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)
})
})
DataTable现在可以使用了!
然而,当我尝试下载显示的数据时,我得到的文件只包含列名而没有数据。根据{{3}},输入$ table_rows_all应该包含显示表的行索引。
出了什么问题?
我在Shiny反应性和MySQL数据库方面遇到了麻烦。
简而言之,我从用户那里获得一个输入值,创建一个SQL查询,捕获输出并将其显示为DataTable。
可以使用DataTable列过滤器进一步过滤输出,用户应该能够下载过滤后的数据集。
server.R
library(shiny)
library(DT)
library(RMySQL)
con <- dbConnect(MySQL(), user="myuser", host="myhost", dbname="mydb")
shinyServer(function(input, output) {
sqlInput <- reactive({
paste0("select * from mydb.mytable",
" where value < ", input$value,
";")
})
sqlOutput <- reactive({
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)
})
})
而不是DataTable,我收到此错误:
如果我将sqlInput
和sqlOutput
嵌入DT::renderDataTable()
中的被动表达式中,这可以正常工作,但我无法从sqlOutput
引用downloadHandler()
在object 'sqlOutput' not found
(reactive()
)内。我认为这是使用$x = new DateTime("2015-9-16 07:00:00");
$y = new DateTime("2015-9-16 20:00:00");
$diff = $x->diff($y);
的完美用例,但我无法使用它。
最好的方法是什么? 非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
1。 sqlOutput
是一个函数,因此将其更改为sqlOutput()
2。试试这个,请注意这将导出为.csv
希望确定
output$download <- downloadHandler(filename = function() {paste(Sys.time(), ' Fltered_data.csv', sep='')}, content = function(file) {write.csv(sqlOutput()[input$table_rows_all, ], file, row.names = FALSE)})