闪亮

2013-07-16 236 views
8

设置全局对象比方说,我在闪亮以下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) 
    }) 
}) 

我做错了什么?

回答

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

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

+0

感谢您的帮助,我对Shiny非常陌生(这是我第二天使用它)。你的解决方案是有效的,但是当我在我的子集例程中插入一个'ifelse()'的时候,并不是这样,它实际上就是这样的:'data2 < - reactive(ifelse(input $ z =='',data,data [data $ x ==输入$ z,]))'。当我这样做时,我得到以下错误:'在plot.window(xlim,ylim,log = log,...)中出错:需要有限的'xlim'值'。 –

+0

顺便说一下,我正在使用RStudio教程(至少是基本部分),并打算深入研究它和随时间推出的软件包文档。 –

+2

@wleoncio错误几乎肯定是因为你传递了一个空的'data.frame'来绘图。所以我会建议做一些调试,以确定'data2'是否会返回您所期望的。你也可以在你的绘图输出函数中添加检查,如'if(nrow(newData)== 0)return()',这将防止它在没有数据时试图绘图。虽然我正在开发一个闪亮的应用程序,但我喜欢添加一个表格,稍后将被注释掉,它只会打印不同的调试值(即当前数据中的行数,某个变量的级别等) –