R Shiny Handling - 从空数据帧处理错误

时间:2014-04-13 02:52:27

标签: r ggplot2 shiny

我正在写我的第一个Shiny应用程序,到目前为止我正在享受它。我的应用程序适用于数据框架,其中包含许多测量膳食方面的变量。它允许用户使用滑块选择六个连续变量的范围。这些输入用于对数据帧进行子集化,然后基于数据子集创建ggplot

我的问题是这样 - 当选择的范围导致子集化数据框中没有数据时,我会在主面板中打印出这条红色错误消息,其中的情节通常是:

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)什么都不显示(即当数据帧为空时没有错误消息或图形给用户)

问题在于,如果我检查空数据框并返回不同的(空白)绘图或消息,那么当用户将滑块设置更改为具有数据的内容时,不会出现正确的绘图(因为反应对象不再相同)。如果我只是让错误消息显示现在并且用户更改设置,则图表会相应更新。

有人可以推荐一种在Shiny中优雅地处理这个问题的方法吗?

1 个答案:

答案 0 :(得分:7)

shiny 0.10.0开始,有两个很好的功能可以帮助您描述的情况,即needvalidate。给出的示例要求用户选择一些groupscohort。如果用户未选择所需对象,则need 功能显示相关输出。也可以通过validate函数分配一个定制的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