如何通过在 R 中包含错误处理来命名 foreach 循环的结果?

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

如何检测

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
是一个列表。如果代码执行成功,名称就会正确显示,但如果其中一次迭代失败,执行就会停止。

r machine-learning foreach parallel-processing
1个回答
0
投票

我还没有找到一种方法可以在%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

并且您可以在此基础上进行您认为合适的后期处理。

© www.soinside.com 2019 - 2024. All rights reserved.