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

eam*_*vey 5 r ggplot2 shiny

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

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

Error: argument is of length zero (from: Error in if (nrow(layer_data) == 0) return() : argument is of length zero).  
Run Code Online (Sandbox Code Playgroud)

我理解为什么会发生这种错误,如果我在典型的数据分析会话期间获得静态图,这是有道理的.但是,我正试图找出在闪亮的Web应用程序情况下处理此问题的正确方法.

由于此消息对用户没有意义,我想:

1)能够用合理的消息代替它或者
2)返回空白图表
3)什么都不显示(即当数据框为空时没有错误信息或图表给用户)

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

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

jdh*_*son 7

由于shiny 0.10.0有两个不错的功能,以帮助你即所描述的情况needvalidate.给出的示例要求用户选择一些groups和a cohort.如果用户未选择所需对象,则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
    })
  }
  )
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述