如何检测
foreach
循环中哪次迭代失败? .errorhandling = "remove"
有助于成功运行代码,但 .final
会导致错误,因为它无法匹配名称。遇到这样的情况该如何处理?
res <- foreach(i=names(train_test_split),
.multicombine = TRUE,
.verbose = TRUE,
.errorhandling = "remove",
.packages = c("caret", "MLmetrics"),
.final = function(x){setNames(x, names(train_test_split))},
.export = c("train_rf_model", "train_glmnet_model", "train_svmRadial_model", "train_nb_model")) %dopar% {}
这里
res
是一个列表。如果代码执行成功,名称就会正确显示,但如果其中一次迭代失败,执行就会停止。
我还没有找到一种方法可以在%dopar%
的电话中做你想做的事情,但这是一种事后解决问题的方法。
library(foreach)
library(tidyverse)
rv <- foreach(
i=1:3,
.multicombine = TRUE,
.verbose = TRUE,
.errorhandling = "remove"
) %dopar% {
tryCatch({
if (i == 2) stop("i == 2 is an error!")
data.frame(Iteration = i, X = runif(3))
},
error = function(cond) {
return(message(cond))
})
}
rv
[[1]]
Iteration X
1 1 0.06072057
2 1 0.94772694
3 1 0.72059627
[[2]]
Iteration X
1 3 0.1422943
2 3 0.5492847
3 3 0.9540912
因此,我们在迭代 2 中出现错误,并且传递给
%dopar%
的循环索引与返回的
list
的索引不匹配。请注意,我已在结果中添加了一列 data.frame
来定义迭代次数。所以现在很容易检查我是否获得了我期望的所有索引:
rv %>%
bind_rows() %>%
distinct(Iteration) %>%
pull(Iteration) %>%
setdiff(1:3, .)
[1] 2
并且您可以在此基础上进行您认为合适的后期处理。