6

我用 R 的闪亮包创建了一个在线实验。假设我有 3 个反应值,称为"toss"、"decision" 和 " rating"
此外,我在 Amazon Web 服务 RDS 上启动了一个MySQL数据库。版本是MySQL 5.6.22
我成功地将非反应值(如时间戳)发送到 MySQL 数据库。所以我认为问题是在 Server.R 代码中找到与 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())})
   }

这样,我不会收到错误消息。所以也许错误在insert into-code中。

此外,我不确定我使用的软件包是否适合此目的。我尝试了很多东西。每当我通过将反应值排除在 SQL 引用之外来添加反应值时,它就会停止工作。我开始认为 RMySQL 缺少该功能。手册中没有任何内容insert into

有没有人能发现我犯的错误?

4

2 回答 2

1

最后,我可以使用以下代码运行查询:

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()
  })
于 2015-11-05T15:12:51.363 回答
0

你有一个问题:

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

问题是:不,在 now() 之前:

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

那应该使查询运行。查看准备好的语句,这将防止这种(很常见的每个人都会犯)连接错误。

于 2015-07-19T19:43:36.260 回答