通常,可以使用paste将变量传递给SQL语句。有趣的是,这不适用于R闪亮的输入变量。使用下面的代码我收到以下错误消息。我该如何解决这个问题?
.getReactiveEnvironment()$ currentContext()中的错误: 没有活动的反应上下文,不允许操作。 (你试过 只能在反应性表达或观察者内部完成的事情。)
--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 :(得分:4)
需要在反应式上下文中评估数据查询。
一种方法是将数据查询本身移动到renderPlot()上下文中,例如
--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)
})
})
但是,最好为数据构建一个无功导体,当发生任何更新并在多个反应端点重复使用时,可以对其进行一次评估(详见here)。
这看起来像是:
--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)
})
})
答案 1 :(得分:1)
为了灵活性,您还可以使用sub
函数替换部分查询字符串,这是非常干净的方法
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))
})