假设我有以下带有闪亮光泽的server.R文件:
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)
})
})
为了不必在每个渲染调用中运行data2 <- data[data$x == input$z, ]
,我该怎么办?如果我执行以下操作,我会得到一个“类型为'闭包的对象'不是子集”错误:
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)
})
})
我做错了什么?
答案 0 :(得分:18)
data2
是一个返回您要查找的子集的函数。因此,您需要调用data2
并将输出保存到某个变量,然后您可以绘制/汇总各个列
## 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)
})
})
如果您还没有,我建议您阅读http://rstudio.github.io/shiny/tutorial/#welcome。关于反应性的页面很好地解决了这个问题。