Shiny中使用tryCatch实现ggplot出错时返回空白图的方法
问题原因
你原有tryCatch写法存在两个问题:
- error回调中执行了
print(e),错误信息仍会输出 finally块仅用于执行收尾逻辑,不会作为tryCatch的返回值,你定义的空白图没有被传递到外部
解决方案
方案1:提前判断字段存在性(更推荐)
先检测Sessions字段是否存在,再决定绘图逻辑,性能和可控性都优于错误捕获:
if ("Sessions" %in% colnames(x)) { p <- x %>% ggplot(aes(date, Sessions)) + geom_col(na.rm = TRUE) + geom_line(aes(y = `Site Conversion Rate`), na.rm = TRUE) } else { # 返回空白图 p <- ggplot() + theme_void() } # Shiny中直接输出p即可 p
如果不需要显示空白图,希望完全不展示绘图内容,在Shiny的renderPlot中直接返回NULL即可:
output$target_plot <- renderPlot({ # x为你动态生成的数据集 if (!"Sessions" %in% colnames(x)) { return(NULL) } x %>% ggplot(aes(date, Sessions)) + geom_col(na.rm = TRUE) + geom_line(aes(y = `Site Conversion Rate`), na.rm = TRUE) })
方案2:修正tryCatch写法
调整错误回调逻辑,直接返回空白图,不要打印错误:
p <- tryCatch( expr = { x %>% ggplot(aes(date, Sessions)) + geom_col(na.rm = TRUE) + geom_line(aes(y = `Site Conversion Rate`), na.rm = TRUE) }, error = function(e) { # 出错直接返回空白图,不要输出错误信息 ggplot() + theme_void() } ) p
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

