如何将响应式输入值从闪亮的应用插入到 MySQL 数据库中?
How to insert reactive input values from a shiny app into a MySQL database?
我使用 R 的 shiny 包创建了一个在线实验。假设我有 3 个 反应值 称为 "toss"、"decision" 和“评级” .
此外,我在 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
代码中。
此外,我不确定我使用的软件包是否适合此目的。我尝试了很多东西。每当我通过将它从 SQL 引号中删除来添加一个反应值时,它就会停止工作。我开始认为 RMySQL 缺少该功能。手册中没有关于 insert into
的内容。
有人能发现我犯的错误吗?
您在以下方面遇到问题:
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())")
那应该使查询 运行。查看准备好的语句,这将防止这种(每个人都很常见)连接错误。
最后,我可以使用以下代码进行查询 运行:
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()
})
我使用 R 的 shiny 包创建了一个在线实验。假设我有 3 个 反应值 称为 "toss"、"decision" 和“评级” .
此外,我在 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
代码中。
此外,我不确定我使用的软件包是否适合此目的。我尝试了很多东西。每当我通过将它从 SQL 引号中删除来添加一个反应值时,它就会停止工作。我开始认为 RMySQL 缺少该功能。手册中没有关于 insert into
的内容。
有人能发现我犯的错误吗?
您在以下方面遇到问题:
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())")
那应该使查询 运行。查看准备好的语句,这将防止这种(每个人都很常见)连接错误。
最后,我可以使用以下代码进行查询 运行:
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()
})