2015-08-17 15 views
6

Thông thường, các biến có thể được chuyển đến câu lệnh SQL bằng cách sử dụng dán. Điều thú vị này không làm việc với các biến đầu vào trong R sáng bóng. Sử dụng mã dưới đây tôi nhận được thông báo lỗi sau. Làm sao tôi có thể giải quyết việc này?Làm thế nào để vượt qua biến đầu vào để câu lệnh SQL trong R sáng bóng?

Lỗi trong .getReactiveEnvironment() $ currentContext(): Operation không được phép mà không có một bối cảnh phản ứng tích cực. (Bạn cố gắng làm cái gì mà chỉ có thể được thực hiện từ bên trong một biểu hiện phản ứng hoặc quan sát.) Truy vấn

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

    }) 
}) 
+0

có một cái nhìn vào câu trả lời của tôi ở đây http://stackoverflow.com/questions/28934967/r-shiny-date-range-input-to-sql-query/28947097#28947097 –

Trả lời

4

Các dữ liệu cần phải được đánh giá trong một bối cảnh phản ứng.

Một cách sẽ là di chuyển truy vấn dữ liệu vào ngữ cảnh renderPlot(), ví dụ:

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

}) 

}) 

Tuy nhiên, nó tốt hơn để xây dựng một dây dẫn phản ứng đối với các dữ liệu có thể được đánh giá một lần khi bất kỳ bản cập nhật xảy ra và tái sử dụng trong nhiều phản ứng end-điểm (xem here để biết chi tiết).

này sẽ giống như thế:

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

thx, gợi ý thứ hai làm việc cho tôi. –

1

Đối với linh hoạt bạn cũng có thể sử dụng sub chức năng để thay thế một phần của chuỗi truy vấn, đây là cách tiếp cận khá sạch

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

thx, hoạt động, nhưng tôi cũng chuyển tên cơ sở dữ liệu cho dbGetQuery. –

Các vấn đề liên quan