在Shiny中设置全局对象

时间:2013-07-16 18:08:11

标签: r subset shiny

假设我有以下带有闪亮光泽的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)
  })
})

我做错了什么?

1 个答案:

答案 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。关于反应性的页面很好地解决了这个问题。