2015-08-17 9 views
6

Di solito, le variabili possono essere passate alle istruzioni SQL usando paste. È interessante notare che questo non funziona con le variabili di input in R shiny. Usando il codice seguente ricevo il seguente messaggio di errore. Come posso risolvere questo?Come passare la variabile di input all'istruzione SQL in R shiny?

Error in .getReactiveEnvironment() $ CurrentContext(): Operazione non consentita senza un contesto reattivo attiva. (Si è tentato di fare qualcosa che può essere fatto solo da dentro un'espressione reattivo o osservatore.) Interrogazione

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

dare un'occhiata alla mia risposta qui http://stackoverflow.com/questions/28934967/r-shiny-date-range-input-to-sql-query/28947097#28947097 –

risposta

4

I dati devono essere valutati in un contesto reattivo.

Un modo sarebbe spostare la query di dati stessa nel contesto renderPlot() ad es.

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

}) 

}) 

Tuttavia, è meglio costruire un conduttore reattivo per i dati che può essere valutata una volta quando nessun aggiornamento avvengono e riutilizzati in molteplici punti finali reattivi (vedi here per i dettagli).

Questo sarebbe simile:

--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, il secondo suggerimento ha funzionato per me. –

1

Per una maggiore flessibilità è anche possibile utilizzare sub funzione per sostituire parte della stringa di query, questo è l'approccio abbastanza pulito

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, funziona, ma ho anche passato il nome del database a dbGetQuery. –