Как вставить реактивные входные значения из блестящего приложения в базу данных MySQL?

Я провел онлайн-эксперимент с пакетом shiny для R. Допустим, у меня есть 3 реактивных значения с именами "бросок", "решение" и "рейтинг".
Кроме того, я запустил базу данных MySQL на веб-службе Amazon RDS. Версия MySQL 5.6.22.
Мне удалось отправить нереактивные значения, такие как метка времени, в базу данных MySQL. Поэтому я предполагаю, что проблема заключается в том, где найти код, взаимодействующий с MySQL, в коде Server.R. Для нереактивных значений он отлично работает, когда код находится вне (до) реактивной серверной функции. Но с реактивными значениями я полагаю, что это должно быть где-то внутри.

Я попробовал этот код:

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

Таким образом, я не получаю сообщение об ошибке. Так что, возможно, ошибка в коде insert into.

Кроме того, я не уверен, что пакеты, которые я использовал, идеально подходят для этой цели. Я пробовал много вещей. Всякий раз, когда я добавляю реактивное значение, оставляя его вне SQL-цитаты, оно перестает работать. Я начинаю думать, что RMySQL не хватает этой функции. В мануале про insert into ничего нет.

Кто-нибудь может обнаружить ошибку, которую я сделал?


person schindst    schedule 13.05.2015    source источник
comment
Когда вы хотите запустить этот sql? Я думаю, вам нужно обернуть dbSendQuery в файл isolate().   -  person cory    schedule 13.05.2015
comment
@cory Спасибо за ваше предложение. Могу ли я просто добавить isolate(sql()) в свой код? Делая это, он все еще не работает. Так что я предполагаю, что это не так просто. Я хочу, чтобы этот sql запускался в конце блестящей сессии.   -  person schindst    schedule 15.05.2015


Ответы (2)


Наконец, я мог бы выполнить запрос с помощью этого кода:

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

Я не смог запустить запрос paste. С sprintf меньше путаницы с запятыми.

И да, мне действительно пришлось добавить isolate(). Я вставил его в observe(). Так это выглядит так:

observe({
    if (input$condition==1){
      isolate({
        writingMarks(input)
      })
    }
    return()
  })
person schindst    schedule 05.11.2015

У вас проблема в:

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

Проблема в следующем: нет, до сих пор():

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

Это должно запустить запрос. Посмотрите на подготовленные операторы, которые предотвратят такого рода (очень распространенные, все делают их) ошибки конкатенации.

person Norbert van Nobelen    schedule 19.07.2015