在Shiny中从SQL存储响应式数据

3

这是对这个问题的跟进:

使用反应式查询在闪亮的应用程序中访问SQL数据库

我正在尝试使用闪亮的应用程序从SQL数据库中获取数据并构建数据框。目前,我能够查询数据库并返回一组数据。现在,我想将这些数据保存到一个数据框中,并从后续查询中添加更多数据。以下是我的代码:

UI

library(markdown)

shinyUI(fluidPage(
  titlePanel("Generic grapher"),
  sidebarLayout(
    sidebarPanel(

      numericInput("wafer", label = h3("Select wafer ID:"), value = NULL),

      actionButton("do", "An action button")
      ),

      mainPanel(
        verbatimTextOutput("value"), verbatimTextOutput("que"), dataTableOutput(outputId="pos")
      )
    )
  )
)

服务器:

library(RMySQL)
library(DBI)
library(sqldf)

con = dbConnect(RMySQL::MySQL(), dbname="xx", username="pete", password="xx", host="xx", port=3306)
query <-  function(...) dbGetQuery(con, ...) 

wq = data.frame()

shinyServer(function(input, output){

  d <- eventReactive(input$do, { input$wafer })

  output$value <- renderPrint({ d() }) 

  a <- reactive({ paste("Select id from wafer where wafer_id=",d(), sep="") })

  output$que <- renderPrint({ a() }) 

  wq <- reactive({  query( a() ) })

  output$pos <- renderDataTable({ wq() })  

  })

现在我正在尝试使用这两个答案的信息来将我每次搜索的数据存储到一个数据框中:

在闪亮的反应表中添加值

反应值和反应表达式之间有什么区别?

新服务器:

library(RMySQL)
library(DBI)
library(sqldf)

con = dbConnect(RMySQL::MySQL(), dbname="xx", username="pete", password="xx", host="xx", port=3306)
query <-  function(...) dbGetQuery(con, ...) 

wq = data.frame()

shinyServer(function(input, output){

  values <- reactiveValues()
  values$df <- data.frame()

  d <- eventReactive(input$do, { input$wafer })

  output$value <- renderPrint({ d() }) 

  a <- reactive({ paste("Select id from wafer where wafer_id=",d(), sep="") })

  output$que <- renderPrint({ a() }) 

  wq <- reactive({  query( a() ) })

  values$df <- reactive({ rbind(values$df, wq() )   }) 

  output$pos <- renderDataTable({ values$df })  

  })

然而,当我这样做时,数据表格从未在我的应用程序中呈现。我没有错误信息。你有任何想法我做错了什么吗?任何帮助都将不胜感激!

我刚刚发布了一个做到这一点的示例应用程序:https://github.com/MarkEdmondson1234/ga-dashboard-demo - MarkeD
请查看 server.r 中的 "eventTable" 和 "eventData",以及 functions.r 中的 MySQL 函数,例如 loadData()。 - MarkeD
谢谢MarkeD,我会尝试复制。那个应用程序非常酷!我会从中学到很多东西,并希望实现其中一些功能。 - Pete900
1个回答

2
我认为更改
values$df <- reactive({ rbind(values$df, wq() )   }) 

在你的新的 server.R
observe({
  values$df <- rbind(isolate(values$df), wq())
})

可能会解决你的问题。

编辑:以下是使用本地连接的有效示例:

library(markdown)
library(RMySQL)
library(DBI)
library(sqldf)

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "mtcars", mtcars)
query <-  function(...) dbGetQuery(con, ...) 

wq = data.frame()

ui <- shinyUI(fluidPage(
  titlePanel("Generic grapher"),
  sidebarLayout(
    sidebarPanel(

      numericInput("wafer", label = h3("Select number of cylinders:"),
                   value = NULL),

      actionButton("do", "An action button")
    ),

    mainPanel(
      verbatimTextOutput("value"),
      verbatimTextOutput("que"),
      verbatimTextOutput("wq_print"),
      dataTableOutput(outputId="pos")
    )
  )
)
)

server <- shinyServer(function(input, output){

  values <- reactiveValues()
  values$df <- data.frame()

  d <- eventReactive(input$do, { input$wafer })

  output$value <- renderPrint({ d() }) 

  a <- reactive({ paste("SELECT * FROM mtcars WHERE cyl = ", d(), sep="") })

  output$que <- renderPrint({ a() }) 

  observe({
    if (!is.null(d())) {
      wq <- reactive({  query( a() ) })

      output$wq_print <- renderPrint({ print(str(wq())) })

      values$df <- rbind(isolate(values$df), wq())
    }
  })

  output$pos <- renderDataTable({ values$df })  

})

shinyApp(ui, server)

与您原始代码相关的更改是在处理d()的初始NULL值时使用!is.null(d())条件,并在观察器中使用values$df <- rbind(isolate(values$df), wq())。 希望这有助于修复您的代码!


感谢您的回复。在尝试时,我遇到了错误:observe({ values$df <- rbind(values$df, wq()) }) 错误:[on_request_read] 连接被对等方重置。 - Pete900
啊,等一下,我没看到隔离。 - Pete900
啊,使用isolate仍然出现相同的错误: observe({ values$df <- rbind(isolate(values$df), wq()) }) 错误:[on_request_read]连接被对等方重置 - Pete900
额,我本来应该省略细节的 :-s!但是没错...好的,需要尽快编辑一下! - Pete900
抱歉。无论如何,是的,这就是我得到的相同错误信息。连接对其他事情有效,并且在我更改代码之前一直有效。 - Pete900
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接