问题
I want to use Shiny to let a user build a data frame by accessing an SQL data base. I want it to work in the following way (but open to suggestions):
- User types in ID (its a number)
- User presses action button
- Reactive query is generated
- Query is sent and data is retrieved, and added to data frame
- User types in next ID...
Here is my attempt:
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")
)
)))
Server
library(RMySQL)
library(DBI)
library(sqldf)
con = dbConnect(RMySQL::MySQL(), dbname="Test_DB", username="pete", password="xx", host="xx", port=3306)
query <- function(...) dbGetQuery(con, ...)
wq = data.frame()
df = 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({ rbind(wq, query( a() )) })
output$pos <- renderDataTable({ wq() })
})
When I run, I can see that both the Id and query will print correctly. However I get this error when app firsts runs:
error in evaluating the argument 'statement' in selecting a method for function 'dbGetQuery': Error:
Then when I type in a wafer id, I get:
Error in xi[[j]] : object of type 'closure' is not subsettable
I know from these posts:
R shiny ERROR: object of type 'closure' is not subsettable
Error in <my code> : object of type 'closure' is not subsettable
That i am probabaly trying to subset an R base function without defining the variable name...but i feel stupid, Ive been staring at it for a day and cant see it. Maybe my whole code is a bad way to query SQL by shiny? Any help appreciated.
Ah dam, ok..if i change this:
wq <- reactive({ rbind(wq, query( a() )) })
to this:
wq <- reactive({ query( a() ) })
Then I get an output. So im sorry, I guess my question changes to how to then populate a df with each additional click of the action button?
回答1:
Store your final object in a list you define as:
wq<- reactiveValues()
....
isolate()
I'm working on something similar with updating a model statement with reactively generated interaction terms. I had to use reactiveValues()
and isolate()
to get it to work. Joe Cheng has an example Gist.
Here's a link. Maybe it will help you. https://gist.github.com/jcheng5/eaedfed5095d37217fca
Best, NF
来源:https://stackoverflow.com/questions/31446500/acessing-sql-database-using-shiny-with-reactive-query