发生错误时在sapply函数中跳至下一级

问题描述 投票:0回答:0

我有一个使用

sapply()
的嵌套函数,我在交互变量和结果变量集上运行。这些函数创建了我然后保存的绘图。建模工作完美,在某些情况下接受由于缺乏数据可用性、因素水平不足等而无法预测特定变量。目前,一旦达到错误,我需要跳过这些无法生成模型的变量,该函数被拖拽,无法生成剩余的图。

我的代码如下所示,适用于

mtcars
数据集:


library(tidyverse)
library(marginaleffects)

outcome_var_list = c("mpg","cyl","wt","hp")
interact_var_list =  c("gear","am","wt")
  
iterate <- sapply(outcome_var_list,function(k){

outcome_var_list = outcome_var_list[outcome_var_list == k] 

results = list()
  for (r in interact_var_list) {
    f = paste(k, "~", r, "*factor(vs)")
    m = lm(f, subset(mtcars, carb %in% c(1,2,3,4)))
    s = plot_slopes(m, variables = r, condition = "vs", draw = FALSE)
    tmp = s[, c("estimate", "conf.low", "conf.high", "vs")]
    tmp$outcome = k
    tmp$regressor = r
    results = c(results, list(tmp))
  }
results = do.call("rbind", results)  


plot1 = results %>% 
  mutate(min = min(conf.low), max = max(conf.high)) %>% ggplot(aes(x=factor(vs), 
           y=estimate, 
           color = regressor, 
           ymin=conf.low, 
           ymax=conf.high)) + 
geom_errorbar(position = position_dodge(0.4)) + 
geom_point(position = position_dodge(0.4)) + 
scale_x_discrete(expand = c(0,0)) + 
theme_light() + 
ggtitle(label = paste0("Model 1: ",k)) + 
theme(plot.title = element_text(hjust = 0.5)) + 
labs(y= "Interaction Coefficient", x = "X") + 
theme(plot.title = element_textbox_simple(vjust=-1)) +
theme(plot.margin = margin(2,0,0,0, "cm")) + 
theme(axis.text.x = element_text(size = 5))

ggsave(plot1,file=paste0("plot_",k,".png"))

})

在此代码中,我将

wt
作为变量包含在
outcome_var_list
中以故意生成错误。
wt
无法预测,因为该变量不能是结果和交互变量。请注意,这不是我原始数据中的错误。如果是这种情况,我可以简单地将其过滤掉,但不幸的是,我的真实数据中的变量组合非常广泛,以至于无法手动过滤。因此,我打算使用通用的东西来捕获函数中的所有错误,并跳到
outcome_var_list
中的下一个变量,无论为什么给定的结果变量不起作用。

运行上述代码时,会生成

mpg
cyl
的图,但不会生成最后两个图。不应该生成
wt
,因为这是不可能的,但是
hp
可以预测并且应该被接受。

如何跳过产生错误的级别并生成所有剩余的绘图?这些错误仅特定于

outcome_var_list
中的变量,而不是interact_var_list,如果有帮助的话。我在其他地方看到过使用
tryCatch
的建议,但这些都显得非常具体。我可以在此代码中实现通用的错误捕获方法来跳过任何错误吗?

r try-catch sapply
© www.soinside.com 2019 - 2024. All rights reserved.