问题
Let's say I have the following server.R file in shiny:
shinyServer(function(input, output) {
output$plot <- renderPlot({
data2 <- data[data$x == input$z, ] # subsetting large dataframe
plot(data2$x, data2$y)
})
output$table <- renderTable({
data2 <- data[data$x == input$z, ] # same subset. Oh, boy...
summary(data2$x)
})
})
What can I do in order to not have to run data2 <- data[data$x == input$z, ]
within every render call? If I do the following, I get a "object of type 'closure' is not subsettable" error:
shinyServer(function(input, output) {
data2 <- reactive(data[data$x == input$z, ])
output$plot <- renderPlot({
plot(data2$x, data2$y)
})
output$table <- renderTable({
data2 <- data[data$x == input$z, ]
summary(data2$x)
})
})
What did I do wrong?
回答1:
data2
is a function which returns the subset you are looking for. So you need to call data2
and save the output to some variable then you can plot/summarize the various columns
## data should be defined somewhere up here or in global.R
shinyServer(function(input, output) {
data2 <- reactive(data[data$x == input$z, ])
output$plot <- renderPlot({
newData <- data2()
plot(newData$x, newData$y)
})
output$table <- renderTable({
newData <- data2()
summary(newData$x)
})
})
If you haven't already, I recommend reading through http://rstudio.github.io/shiny/tutorial/#welcome. The page on reactivity addresses this question fairly well.
来源:https://stackoverflow.com/questions/17683933/set-global-object-in-shiny