How to pass input variable to SQL statement in R shiny?

后端 未结 2 1954
耶瑟儿~
耶瑟儿~ 2020-12-09 14:00

Usually, variables can be passed to SQL statements using paste. Interestingly this doesn\'t work with input variables in R shiny. Using the below code I get the following er

相关标签:
2条回答
  • 2020-12-09 14:11

    The data query needs to be evaluated in a reactive context.

    One way would be to move the data query itself into the renderPlot() context e.g.

    --server.R--
    
    shinyServer(function(input, output) {
    
     database <- dbConnect(MySQL(), group= "zugangsdaten", dbname= 'database')
    
     output$main_plot <- renderPlot({
    
       table <- dbGetQuery(database, statement = 
                  paste("
                    SELECT a,b FROM table1
                    WHERE id = ",input$segment,"
                    AND created_at>='2015-08-01'
                  "))
    
        plot(table$a,table$b)
    
     })
    
    })
    

    However, it's better to construct a reactive conductor for the data which can be evaluated once when any updates happen and re-used in multiple reactive end-points (see here for details).

    This would look something like:

    --server.R--
    
    shinyServer(function(input, output) {
    
     database <- dbConnect(MySQL(), group= "zugangsdaten", dbname= 'database')
    
     table <- reactive({
                dbGetQuery(database, statement = 
                  paste("
                    SELECT a,b FROM table1
                    WHERE id = ",input$segment,"
                    AND created_at>='2015-08-01'
                  ")
                )
              })
    
     output$main_plot <- renderPlot({
    
        plot(table()$a,table()$b)
    
     })
    
    }) 
    
    0 讨论(0)
  • 2020-12-09 14:12

    For flexibility you can also use sub function to substitute part of the query string, this is quite clean approach

    table <- reactive({ 
      my_query <- 'SELECT a,b FROM table1 WHERE id = SOMETHING AND created_at >= 2015-08-01'
      my_query <- sub("SOMETHING",input$segment,my_query)
      dbGetQuery(database,noquote(my_query))
    })
    
    0 讨论(0)
提交回复
热议问题