如何防止 RMySQL 错误并在 Shiny 中显示给用户?
How can I prevent RMySQL errors and show to user in Shiny?
我有一个闪亮的应用程序,可以像这个例子一样对 MySQL 数据库执行查询:
UI
textAreaInput("query")
服务器
data <- reactive({
df<-dbGetQuery(conection, input$query)
return(df)
})
问题在于,当用户在 textAreaInput 中键入错误的语法时,Shiny App 会关闭并且错误会显示在 R 控制台中。
我想要的是在应用程序中打印该错误,以便用户可以重试并编写另一个查询。
有人可以帮我吗?
我们可以使用tryCatch
。这是基于@Fan Li 的回答的完整示例
library(RSQLite)
con <- dbConnect(SQLite(), dbname="sample.sqlite")
dbWriteTable(con, "test", data.frame(value1 = letters[1:4], value2 = letters[5:8]))
dbDisconnect(con)
library(shiny)
library(RSQLite)
runApp(list(
ui = bootstrapPage(
#select * from te fail
#select * from test work
textAreaInput("query",'Query'),
actionButton("action", label = "Run Query"),
hr(),
tableOutput("table")
),
server = function(input, output){
#Reactive is eager by definition and it will signal unreal/annoying errors, hence I used eventReactive
data <- eventReactive(input$action,{
tryCatch({
con <- dbConnect(SQLite(), dbname="sample.sqlite")
data<-dbGetQuery(con, input$query)
dbDisconnect(con)
return(data)
},
error = function(e){
showModal(
modalDialog(
title = "Error Occurred",
tags$i("Please enter valid query and try again"),br(),br(),
tags$b("Error:"),br(),
tags$code(e$message)
)
)
})
})
output$table <- renderTable(data())
}))
我有一个闪亮的应用程序,可以像这个例子一样对 MySQL 数据库执行查询:
UI
textAreaInput("query")
服务器
data <- reactive({
df<-dbGetQuery(conection, input$query)
return(df)
})
问题在于,当用户在 textAreaInput 中键入错误的语法时,Shiny App 会关闭并且错误会显示在 R 控制台中。
我想要的是在应用程序中打印该错误,以便用户可以重试并编写另一个查询。
有人可以帮我吗?
我们可以使用tryCatch
。这是基于@Fan Li 的回答的完整示例
library(RSQLite)
con <- dbConnect(SQLite(), dbname="sample.sqlite")
dbWriteTable(con, "test", data.frame(value1 = letters[1:4], value2 = letters[5:8]))
dbDisconnect(con)
library(shiny)
library(RSQLite)
runApp(list(
ui = bootstrapPage(
#select * from te fail
#select * from test work
textAreaInput("query",'Query'),
actionButton("action", label = "Run Query"),
hr(),
tableOutput("table")
),
server = function(input, output){
#Reactive is eager by definition and it will signal unreal/annoying errors, hence I used eventReactive
data <- eventReactive(input$action,{
tryCatch({
con <- dbConnect(SQLite(), dbname="sample.sqlite")
data<-dbGetQuery(con, input$query)
dbDisconnect(con)
return(data)
},
error = function(e){
showModal(
modalDialog(
title = "Error Occurred",
tags$i("Please enter valid query and try again"),br(),br(),
tags$b("Error:"),br(),
tags$code(e$message)
)
)
})
})
output$table <- renderTable(data())
}))