关闭闪亮的应用程序后(使用“pool”包),Rstudio 崩溃

问题描述 投票:0回答:2

我基本上有一个闪亮的应用程序,就像在这个例子中

library(shiny)
library(DBI)
library(pool)

# create the connection
pool <- dbPool(
  drv = RMySQL::MySQL(),
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  username = "guest",
  password = "guest"
)
onStop(function() {
  message("closing...")
  pool::poolClose(pool)
})

# === UI ====
ui <- fluidPage(
  textInput("ID", "Enter your ID:", "5"),
  tableOutput("tbl"),
  numericInput("nrows", "How many cities to show?", 10),
  plotOutput("popPlot")
)

#==== SERVER ====
server <- function(input, output, session) {
  output$tbl <- renderTable({
    sql <- "SELECT * FROM City WHERE ID = ?id;"
    query <- sqlInterpolate(pool, sql, id = input$ID)
    dbGetQuery(pool, query)
  })
  output$popPlot <- renderPlot({
    query <- paste0("SELECT * FROM City LIMIT ",
                    as.integer(input$nrows)[1], ";")
    df <- dbGetQuery(pool, query)
    pop <- df$Population
    names(pop) <- df$Name
    barplot(pop)
  })
}

#=== Run the App====
shinyApp(ui, server)

这个错误已经在几年前的这篇文章中被问过,但答案并没有解决我这边的问题。 (他们建议获取最新的“稍后”软件包,但我这样做了并且错误仍然存在)。 所以错误是:一旦我单击 RStudio 服务器会话上的“停止”底部(以停止运行良好的闪亮应用程序仪表板),它就不会停止。相反,会出现一个弹出窗口,显示:Terminate R(并且控制台中不会出现消息错误)

我尝试了几个小时来解决这个恼人的行为(它让我每次重新启动 Rstudio 会话时都回忆起系统环境变量),然后我找到了一个临时解决方案:按“控制台”上的 “Esc” 按钮来停止该进程,避免弹出“Terminate R”。然后它真的停止了,我可以再次重新运行 Shiny 应用程序。我想指出的是,“停止”图标(参见附图中的红色圆圈)无法正常工作。相反,“Esc”起作用。 有人知道为什么会发生这种情况吗?我还将在 GitHub“池”问题中报告它。虽然我不完全确定问题是否出在包装上。

我正在使用 R.4.1.0(我的连接是使用 odbc 驱动程序连接到 Postgress,但未显示在代码中。我的会话在 RStudio Workbench 2021.092(Build 382.pro1)中运行。我正在使用“池” “ v.0.1.6.

shiny crash odbc pool rstudio-server
2个回答
1
投票

我也注意到池包有些不稳定。对我来说,当正确检出并返回对象时,它就会解决。看看当您按如下方式更改代码时会发生什么:

output$tbl <- renderTable({
sql <- "SELECT * FROM City WHERE ID = ?id;"
con <- poolCheckout(pool)
on.exit(poolReturn(con)
dbGetQuery(con, sql)
})

并且:

output$popPlot <- renderPlot({
query <- paste0("SELECT * FROM City LIMIT ",
                as.integer(input$nrows)[1], ";")
con <- poolCheckout(pool)
df <- dbGetQuery(con, query)
poolReturn(con)
pop <- df$Population
names(pop) <- df$Name
barplot(pop)
})

我向您展示了两种编写池返回语句的方法,因此您可以选择对您来说更自然的一种。


0
投票

我建议在 Posit 社区发布的解决方案:R crashes Shiny App

library(shiny)
ui <- fluidPage()
server <- function(input, output, session) {  
session$onSessionEnded(function() { stopApp() })}
shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.