9

假设我有以下闪亮的 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, ]在每个渲染调用中运行,我该怎么做?如果我执行以下操作,我会收到“'closure' 类型的对象不是子集”错误:

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)
  })
})

我做错了什么?

4

1 回答 1

19

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

于 2013-07-16T18:27:04.533 回答