You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 04:00:05