2014-04-13 32 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