在Shiny中设置全局对象

Wal*_*cio 9 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)
   })
})
Run Code Online (Sandbox Code Playgroud)

为了不必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)
  })
})
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Jak*_*ead 17

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)
  })
})
Run Code Online (Sandbox Code Playgroud)

如果您还没有,我建议您阅读http://rstudio.github.io/shiny/tutorial/#welcome.关于反应性的页面很好地解决了这个问题.

  • @wleoncio这个错误几乎肯定是因为你将一个空的`data.frame`传递给了plot.所以我建议做一些调试来弄清楚`data2`是否会返回你期望的内容.您还可以在绘图输出函数中添加检查,例如`if(nrow(newData)== 0)return()`,这将使其在没有数据时不会尝试绘制.当我正在开发一个闪亮的应用程序时,我喜欢添加一个表,稍后将被注释掉,这将只打印不同的调试值(即当前数据中的行数,某个变量的级别等) (3认同)