如何使 Shiny 反应与 SQL 数据库一起工作?
How to make Shiny reactivity work with SQL database?
好的,我按照@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 现在可用了!
但是,当我尝试下载显示的数据时,我得到一个只有列名而没有数据的文件。根据 DT docs,input$table_rows_all 应该包含显示的 table.
的行索引
怎么了?
我在使用 Shiny 反应性和 MySQL 数据库时遇到问题。
简而言之,我从用户那里得到一个输入值,创建一个 SQL 查询,捕获输出并将其显示为数据表。
可以使用 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)
})
})
我收到此错误而不是数据表:
如果我将 sqlInput
和 sqlOutput
嵌入到 DT::renderDataTable()
中的反应式表达式中,这将按预期工作,但我无法从中引用 sqlOutput
在 downloadHandler()
(object 'sqlOutput' not found
) 之内。我认为这是使用 reactive()
的完美用例,但我无法让它工作。
完成这项工作的最佳方法是什么?
非常感谢任何帮助,谢谢!
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)})
好的,我按照@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 现在可用了!
但是,当我尝试下载显示的数据时,我得到一个只有列名而没有数据的文件。根据 DT docs,input$table_rows_all 应该包含显示的 table.
的行索引怎么了?
我在使用 Shiny 反应性和 MySQL 数据库时遇到问题。
简而言之,我从用户那里得到一个输入值,创建一个 SQL 查询,捕获输出并将其显示为数据表。
可以使用 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)
})
})
我收到此错误而不是数据表:
如果我将 sqlInput
和 sqlOutput
嵌入到 DT::renderDataTable()
中的反应式表达式中,这将按预期工作,但我无法从中引用 sqlOutput
在 downloadHandler()
(object 'sqlOutput' not found
) 之内。我认为这是使用 reactive()
的完美用例,但我无法让它工作。
完成这项工作的最佳方法是什么? 非常感谢任何帮助,谢谢!
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)})