2015-05-13 9 views
6

Ho creato un esperimento in linea con la lucida pacchetto per R. Diciamo che ho 3 valori reattivi chiamati "toss", "decisione" e "rating".
Inoltre, ho lanciato un database MySQL sul servizio Web Amazon RDS. La versione è MySQL 5.6.22.
Sono riuscito a inviare valori non reattivi, come il timestamp, al database MySQL. Quindi presumo che il problema è dove trovare il codice che parla con MySQL all'interno del codice Server.R. Per i valori non reattivi funziona perfettamente quando il codice è al di fuori (prima) della funzione server reattivo. Ma con valori reattivi suppongo che dovrebbe essere da qualche parte all'interno.

Ho provato questo codice:
Come inserire valori di input reattivi da un'app lucida in un database MySQL?

Server.R 
    library(shiny) 
    library(RMySQL) 
    library(DBI) 
    con <- dbConnect(MySQL(), dbname="db", username="myname", password="mypassword", host="myhost.com", port=xxxx) 
    function(input, output, session){ 
     sql <- reactive({ 
       paste("insert into scenario1 (toss, dec, rat, timestamp) 
        values (",input$toss,",",input$decision,",",input$rating,"now())") 
     }) 
     result<-reactive({dbSendQuery(con, sql())}) 
    } 

In questo modo, non si ottiene un messaggio di errore. Quindi forse l'errore è all'interno del codice insert into.

Inoltre, non sono sicuro se i pacchetti che ho usato siano ideali per questo scopo. Ho provato un sacco di cose. Ogni volta che aggiungo un valore reattivo lasciandolo fuori dall'offerta SQL smette di funzionare. Sto iniziando a pensare che RMySQL manchi quella funzione. Non c'è nulla di insert into nel manuale.

Qualcuno è in grado di rilevare l'errore che ho fatto?

+0

Quando si desidera eseguire sql? Penso che avrai bisogno di avvolgere il tuo dbSendQuery in un 'isolare()'. – cory

+0

@cory Grazie per il suggerimento. Dovrei semplicemente aggiungere 'isolate (sql())' al mio codice? In questo modo non funziona ancora. Quindi presumo che non sia così semplice. Voglio che sql venga eseguito alla fine della sessione brillante. – schindst

risposta

1

Infine, ho potuto fare la query eseguire con questo codice:

writingMarks <- function(input){ 
    con <- dbConnect(MySQL(), dbname="db", username="myname", password="mypassword", 
      host="myhost.com", port=xxxx) 
    result <- sprintf<-("insert into scenario1 (toss, dec, timestamp) values (%s,%s,%s)", 
       input$toss, input$decision, "now()") 
    dbSendQuery(con, result) 
} 

non ho potuto fare la corsa paste query. Con sprintf c'è meno confusione con le virgole.

E, sì, ho dovuto aggiungere uno isolate(). L'ho inserito in un observe(). Quindi sembra che questo:

observe({ 
    if (input$condition==1){ 
     isolate({ 
     writingMarks(input) 
     }) 
    } 
    return() 
    }) 
0

hai un problema in:

paste("insert into scenario1 (toss, dec, rat, timestamp) 
values (",input$toss,",",input$decision,",",input$rating,"now())") 

La questione è: No, prima d'ora():

paste("insert into scenario1 (toss, dec, rat, timestamp) 
values (",input$toss,",",input$decision,",",input$rating,",now())") 

che dovrebbero rendere la corsa query. Guarda in dichiarazioni preparate, che impediranno questo genere di errori di concatenazione (molto comuni a tutti).

Problemi correlati