Как я могу предотвратить ошибки RMySQL и показать пользователю в Shiny? - PullRequest
0 голосов
/ 17 января 2019

У меня есть приложение Shiny, которое выполняет запрос к базе данных MySQL, как в этом примере:

UI

textAreaInput("query")

SERVER

data <- reactive({
  df<-dbGetQuery(conection, input$query)
  return(df)
})

Проблема в том, что когда пользователь вводит неправильный синтаксис в textAreaInput, Shiny App закрывается, и ошибка отображается в консоли R.

Я хочу напечатать эту ошибку в приложении, чтобы пользователь мог повторить попытку и написать другой запрос.

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 18 января 2019

Мы можем использовать 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())
  }))
...