【发布时间】:2023-03-29 10:28:01
【问题描述】:
我正在制作一个交互式 Shiny 应用程序,用于在我的计算机上搜索 MySQL 数据库。我可以访问数据库并在 R 脚本和静态 Shiny 应用程序中正确执行查询,但是只有在用户单击操作按钮时才尝试执行查询时遇到了麻烦。
当我将查询包装在 Shiny 的事件触发函数中时会出现问题,例如 observeEvent()。例如,以下代码运行并检索正确的数据集:
shinyServer(function(input, output, session){
con <- dbConnect(RMySQL::MySQL(), dbname = "testdb", user='testuser', password = "testpassword")
tableList <- dbListTables(con)
output$out <- renderPrint(tableList) #this always prints
df <- data.frame()
#observeEvent(input$button, {
quer <- paste("select id, dept, course_code from main_course_info
where dept in (select id from dept_relations
where deptName = 'CMPE')")
df <- data.frame(dbGetQuery(con, quer))
output$table <- renderTable({df})
#})
dbDisconnect(con)
})#shinyServer
注释掉observeEvent 函数后,查询完美运行并显示检索到的表。但是,当我尝试在 input$button 更改之前暂停查询时,即按下按钮时,按下按钮时出现以下错误:
Warning in run(timeoutMs) :
Unhandled error in observer: internal error in RS_DBI_getConnection: corrupt connection handle
observeEvent(input$button)
我需要这个按钮功能才能工作,因为我的目标是让查询的细节由用户输入决定,一旦用户做出选择并点击操作按钮,这些查询将被汇集并执行。但是,我什至无法使用 observeEvent 运行预定义的查询,这对于我的应用程序的设计来说是不可或缺的。
请注意,无论按钮成功或失败,第一个输出,即数据库中表列表的renderPrint 始终会打印。这意味着连接至少在它被发送到observeEvent 的处理程序参数之前是有效的。
【问题讨论】:
-
不确定发生了什么,但我会在
observeEvent中调用browser()以便您可以看到连接的样子。另外,看看如果你在observeEvent中再次初始化连接会发生什么?这些都不是解决方案,只是试图帮助调试。
标签: mysql r button shiny rstudio