Хранение реактивных данных в блестящем виде из SQL

Это продолжение этого вопроса:

Доступ к базе данных SQL с помощью shiny с реактивным запросом

Я пытаюсь создать фрейм данных из данных, полученных из базы данных 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 })  

  })

Однако, когда я это делаю, таблица данных никогда не отображается в моем приложении. У меня нет сообщения об ошибке. Есть идеи, где я ошибаюсь? Любая помощь приветствуется!


person Pete900    schedule 16.07.2015    source источник
comment
Я только что опубликовал пример приложения, которое делает это: github.com/MarkEdmondson1234/ga-dashboard-demo   -  person MarkeD    schedule 16.07.2015
comment
проверьте server.r для eventTable и eventData, а также функции MySQL в functions.r, такие как loadData ()   -  person MarkeD    schedule 16.07.2015
comment
Спасибо, MarkeD, попробую воспроизвести. Это приложение очень крутое! Я многому научусь и надеюсь реализовать некоторые функции.   -  person Pete900    schedule 16.07.2015


Ответы (1)


Я думаю изменить

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)

Соответствующие изменения в исходном коде - это !is.null(d()) условие обработки начального NULL значения d() и использование values$df <- rbind(isolate(values$df), wq()) внутри наблюдателя. Надеюсь, это поможет исправить ваш код!

person Mikko Marttila    schedule 16.07.2015
comment
Спасибо за ответ. При попытке я получаю сообщение об ошибке: наблюдайте ({values ​​$ df ‹- rbind (values ​​$ df, wq ())}) ОШИБКА: [on_request_read] соединение сброшено одноранговым узлом - person Pete900; 16.07.2015
comment
ах подождите, я не видел изолировать - person Pete900; 16.07.2015
comment
ах все еще та же ошибка с изолировать: наблюдать ({значения $ df ‹- rbind (изолировать (значения $ df), wq ())}) ОШИБКА: [on_request_read] соединение сброшено одноранговым узлом - person Pete900; 16.07.2015
comment
Является ли вызов dbConnect, который вы показываете в коде, правильным для использования? Когда я пытаюсь воспроизвести ваш пример, я получаю сообщение об ошибке при подключении к базе данных, за которым следует ERROR: [on_request_read] connection reset by peer. - person Mikko Marttila; 16.07.2015
comment
Э, черт, я должен был опустить детали: -s! но да, это правильно ... хорошо, нужно отредактировать это как можно скорее! - person Pete900; 16.07.2015
comment
Извини за это. В любом случае да, это то же самое сообщение об ошибке, которое я получаю. Соединение работает для других вещей и работало до того, как я изменил код. - person Pete900; 16.07.2015
comment
да, я только что проверил, dbConnect работает без обновленного кода, чтобы наблюдать значения $ df - person Pete900; 16.07.2015
comment
Хех, достаточно честно! Вместо этого я поигрался, используя локальное соединение. Думаю, проблема в том, что при запуске значение d() будет NULL. Я немного отредактирую рабочий пример в своем ответе. - person Mikko Marttila; 16.07.2015
comment
@Pete Добавил рабочий пример, надеюсь, вы сможете внести соответствующие изменения в свой код и посмотреть, помогут ли они. - person Mikko Marttila; 16.07.2015
comment
Большое спасибо. Кроме того, спасибо за то, что вы были внимательны к моей ошибке, связанной с подключением входа в систему SQL !! Блестяще. - person Pete900; 16.07.2015