首页 文章

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

提问于
浏览
6

通常,可以使用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)

    })
})

2 回答

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

    但是,最好为数据构建一个反应导体,当发生任何更新并在多个反应 endpoints 重复使用时,可以对其进行一次评估(详见here) .

    这看起来像是这样的:

    --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)
    
     })
    
    })
    
  • 1

    为了灵活性,您还可以使用 sub 函数替换部分查询字符串,这是非常干净的方法

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

相关问题