【问题标题】:Query on button press in Shiny app (R)查询 Shiny 应用程序中的按钮按下 (R)
【发布时间】: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


【解决方案1】:

您没有将获取数据的查询放入响应式表达式中吗?也看看这里:Get value from reactive context in R shiny based on user input

编辑:

全局定义连接,将con &lt;- ""放在shinyServer(function(input, output, session){}之前,这样在启动应用时它只会打开一个连接,然后每次查询时都重用这个连接。

con <- dbConnect(RMySQL::MySQL(), dbname = "testdb", user='testuser', password = "testpassword")

my_data <- reactive({ 
  if(input$button == 0)
  {
    return(0)
  }
  isolate({
    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))
    df
  })
})
output$table <- renderTable({my_data()})

【讨论】:

  • 如果我也在反应性语句内(但在隔离之外)重新建立了连接,这会暂时起作用,但是在几次使用后它会给我一个“连接太多”的错误。我尝试在响应式语句中断开连接并重新连接,但这给了我损坏的连接句柄错误。
  • 你应该把 con
  • 不知何故不起作用,它起作用的唯一方法是如果我在 my_data &lt;- reactive({}) 函数中开始和结束连接。它也不能在 observeEvent 函数中工作。我让它做我想做的事,但它肯定效率低下,因为我现在还有其他几个创建和结束连接的反应值。
猜你喜欢
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2017-07-08
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多