在RStudio的flexdashboard+Shiny+Plotly可视化中如何用tryCatch处理报错?
在flexdashboard中处理无数据时的可视化报错
当选择无记录的参数时,你的可视化会因空数据报错,用tryCatch()可以捕获错误并显示友好提示,具体实现如下:
核心逻辑
将renderPlotly()内部的可视化渲染代码全部包裹在tryCatch()中,通过error参数定义报错时的替代显示内容(比如带提示文字的空图表)。
修改后的完整代码
### {data-width=498} ```{r} # 时间序列数据处理(保留原逻辑即可) timeseries88 <- reactive(selected_80() %>% dplyr::group_by(Year, FECHAFACTURA, dia_año) %>% dplyr::summarise(VALORNETO = sum(VALORNETO)) %>% mutate(text = paste("Año: ", Year, "\nVenta Neta: $", round(VALORNETO/1000000, 4), " M", "\nFecha: ", format(FECHAFACTURA, format = "%d/%m/%Y"), sep = "") , fechames = format(FECHAFACTURA, "%d-%m")) %>% arrange(FECHAFACTURA) ) renderPlotly({ tryCatch( # 正常渲染图表的原代码 expr = { ggplotly(ggplot(timeseries88(), aes(x = FECHAFACTURA, y = VALORNETO, group = Year, text = text))+ geom_point(size = 0.75, color = color_periodo_unico)+ geom_line(size = 0.3, color = color_periodo_unico)+ labs(x = "", y = "")+ theme(axis.text.x = element_text(angle = 60, hjust = 1), legend.text = element_text(size = 8.5), text = element_text(size = 8.5), axis.ticks.x = element_blank(), panel.background = element_blank()) + scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6)), tooltip = "text") %>% layout(xaxis = list(autorange = TRUE), yaxis = list(autorange = TRUE), showlegend = F, title = list(text = 'Venta de Período', x = 0.05)) %>% config(displayModeBar = F) }, # 捕获错误时返回带提示的空图表 error = function(e) { plotly_empty() %>% layout(title = list(text = "⚠️ 所选参数无匹配记录", x = 0.5), annotations = list(text = "请调整参数选择", x = 0.5, y = 0.5, showarrow = FALSE)) %>% config(displayModeBar = F) } ) })
## 关键说明 - `expr`参数:存放原本的可视化渲染代码,正常场景下执行这部分并返回图表。 - `error`参数:接受一个函数,参数`e`为捕获到的错误对象(可不用但需保留参数位),函数内部返回替代的plotly对象,这里用`plotly_empty()`生成空画布并添加提示文本。 - 可选优化:也可以在`timeseries88`这个reactive中先判断数据是否为空,提前返回空数据框再处理,但`tryCatch()`更通用,能覆盖数据类型错误、字段缺失等所有可能的报错场景。 内容的提问来源于stack exchange,提问作者Dan Valle
相关产品推荐
相关产品推荐

