如何将输入变量传递给R中的SQL语句?

Mar*_*ber 6 r shiny

通常,可以使用paste将变量传递给SQL语句.有趣的是,这不适用于R闪亮的输入变量.使用下面的代码我收到以下错误消息.我怎么解决这个问题?

.getReactiveEnvironment()中的错误$ currentContext():没有活动的响应上下文时不允许操作.(你试图做一些只能在反应式表达式或观察者内部完成的事情.)

--ui.R--

shinyUI(bootstrapPage(

  selectInput(inputId = "segment",
          label = "segment",
          choices = c(1, 2, 3, 4),
          selected = 1),

  plotOutput(outputId = "main_plot", height = "300px")

))


--server.R--

shinyServer(function(input, output) {

     database <- dbConnect(MySQL(), group= "zugangsdaten", dbname= 'database')

     input<- input$segment

     table <- dbGetQuery(database, statement = 
                      paste("
                      SELECT a,b FROM table1
                      WHERE id = ",input,"
                      AND created_at>='2015-08-01'
                      "))

  output$main_plot <- renderPlot({

    plot(a,b)

    })
})
Run Code Online (Sandbox Code Playgroud)

Jon*_*der 4

数据查询需要在反应式上下文中进行评估。

一种方法是将数据查询本身移动到 renderPlot() 上下文中,例如

--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)

 })

})
Run Code Online (Sandbox Code Playgroud)

然而,最好为数据构建一个无功导体,可以在发生任何更新时对其进行一次评估,并在多个无功端点中重复使用(有关详细信息,请参阅此处)。

这看起来像:

--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)

 })

}) 
Run Code Online (Sandbox Code Playgroud)