2014-04-13 46 views
4

我正在寫我的第一個Shiny應用程序,到目前爲止我都在享受它。我的應用程序適用於包含許多測量膳食方面變量的數據框。它允許用戶使用滑塊選擇六個連續變量的範圍。這些輸入用於子集數據框,然後基於數據子集創建一個ggplotR Shiny Handling - 處理來自空數據幀的錯誤

我的問題是這樣的 - 當所選範圍中的結果沒有留在子集化數據幀的數據,我得到在主面板,其中所述情節通常會印刷此紅色錯誤消息:

Error: argument is of length zero (from: Error in if (nrow(layer_data) == 0) return() : argument is of length zero). 

我明白爲什麼會發生此錯誤,並且在典型的數據分析會話期間獲取靜態圖是有意義的。但是,我試圖找出正確的方式來處理這個閃亮的web應用程序的情況。

由於該消息是沒有意義的用戶,我想:

1)能夠與一個明智的消息替換成OR
2)返回一個空白圖表OR
3)顯示什麼(即沒有錯誤消息或圖形用戶當數據幀爲空)

的問題是,如果我檢查一個空的數據幀,並返回不同的(空白)的情節或消息,然後當用戶更改滑塊設置確實有數據的東西,正確的情節不會出現(因爲被動對象不再是相同的)。如果我只是讓錯誤消息像現在一樣出現,並且用戶更改了設置,則圖表會適當更新。

有人可以推薦一種方法來處理這種優雅的閃亮?

+1

爲什麼不使用某種類型的錯誤捕獲? – JEquihua

+1

請參閱[如何製作一個很好的重複示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),並在您的ui中顯示突出部分。 R'和'server.R' – hrbrmstr

回答

5

shiny 0.10.0起,有兩個很好的功能可以幫助您描述的情況,即needvalidate。給出的例子要求用戶選擇一些groupscohort。如果用戶沒有選擇所需的對象,那麼功能將顯示相關的輸出。也可以通過然後可以用於造型的驗證功能來分配定製CSS類:

library(shiny) 
library(ggplot2) 
myData <- data.frame(group = sample(letters[1:4], 100, TRUE) 
        , cohort = sample(0:4, 100, TRUE) 
        , value = runif(100)) 
runApp(
    list(ui = fluidPage(
    column(4, 
    checkboxGroupInput('group', 'Pick a group', choices = letters[1:4]), 
    selectizeInput('cohort', 'Pick a cohort', choices = 0:4)), 
    column(8, plotOutput('myplot')) 
) 
    , server = function(input, output, session) { 
    appData <- reactive({ 
     myData[myData$group %in% input$group & myData$cohort == input$cohort,] 
    }) 
    output$myplot <- renderPlot({ 
     validate(
     need(input$group, 'Please select at least one group'), 
     need(input$cohort > 0, 'Please choose a cohort greater than zero') 
    ) 
     g <-ggplot(appData(),aes(x=group, y=value)) + 
     stat_summary(fun.y=sum, geom="bar") + 
     ggtitle(paste('cohort', input$cohort)) 
     g 
    }) 
    } 
) 
) 

enter image description here