我正在写我的第一个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中优雅地处理这个问题的方法吗?
答案 0 :(得分:7)
从shiny 0.10.0
开始,有两个很好的功能可以帮助您描述的情况,即need
和validate
。给出的示例要求用户选择一些groups
和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
})
}
)
)