如何在ggplot2代码报错时跳过?求编写可扩展容错代码
适配有无分面变量的ggplot绘图方案
样本数据
dat <- structure(list(n_speed = c(7, 6, 5, 4, 7, 6, 4, 9), id = c("subj_1", "subj_1", "subj_1", "subj_1", "subj_2", "subj_2", "subj_2", "subj_2" ), timepoint = c("t1", "t1", "t2", "t2", "t1", "t1", "t2", "t2" ), direction = c("long", "lat", "long", "lat", "long", "lat", "long", "lat")), class = "data.frame", row.names = c(NA, -8L)) speed_measures <- structure(list(n_speed = c(7, 6, 5, 4, 7, 6, 4, 9), id = c("subj_1", "subj_1", "subj_1", "subj_1", "subj_2", "subj_2", "subj_2", "subj_2" ), timepoint = c("t1", "t1", "t2", "t2", "t1", "t1", "t2", "t2" ), direction = c("long", "lat", "long", "lat", "long", "lat", "long", "lat")), class = "data.frame", row.names = c(NA, -8L)) dat_combined <- speed_measures |> left_join(dat)
初始代码及报错
编写的绘图代码如下:
ggplot(data = dat_combined, aes(x = n_speed)) + geom_histogram() + facet_wrap(~direction)
运行时出现以下错误:
Error in `combine_vars()`: ! Faceting variables must have at least one value Backtrace: 1. base (local) `<fn>`(x) 2. ggplot2:::print.ggplot(x) 4. ggplot2:::ggplot_build.ggplot(x) 5. layout$setup(data, plot$data, plot$plot_env) 6. ggplot2 (local) setup(..., self = self) 7. self$facet$compute_layout(data, self$facet_params) 8. ggplot2 (local) compute_layout(..., self = self) 9. ggplot2::combine_vars(data, params$plot_env, vars, drop = params$drop)
报错原因是当前数据集可能不包含facet_wrap所需的分面变量direction。需要编写可扩展的代码,自动适配有无该分面变量的数据集,无需单独重写绘图流程。
尝试的无效方案
曾尝试用try语句捕获错误,但未达到预期效果:
try(ggplot(data = dat_combined, aes(x = n_speed)) + geom_histogram() + facet_wrap(~direction))
最终可行代码
采纳建议后使用的最终代码,先判断数据有效性,再执行对应的逻辑:
if(is.na(dat_combined$n_speed[1])) { print("No Data") } else { ggplot(data = dat_combined, aes(x = n_speed)) + geom_histogram() + facet_wrap(~direction) }
内容的提问来源于stack exchange,提问作者myfatson
相关产品推荐
相关产品推荐

