閃亮

2013-07-16 239 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()',這將防止它在沒有數據時試圖繪圖。雖然我正在開發一個閃亮的應用程序,但我喜歡添加一個表格,稍後將被註釋掉,它只會打印不同的調試值(即當前數據中的行數,某個變量的級別等) –