R 中 foreach() 中的 try() 问题

Problems with try() inside foreach() in R

我正在尝试使用 try() 函数来处理并行化 for 循环中发生的错误:

results <- foreach (i = 1:2, .errorhandling = 'remove') %dopar% {
    res <- try(myfun(i), TRUE)
}

myfun <- function(i){
    if (i==1) return(rnorm(1))
    else stop('error')
}

我收到以下错误消息

Error in checkForRemoteErrors(val) : 
  one node produced an error: Error in myfun(i) : error

如何让 foreach "loop" 忽略错误消息(或者至少更优雅地处理它)?

您可以使用tryCatch并适当处理错误。这里忽略错误(返回NULL)

results <- foreach (i = 1:2) %dopar% {
    res <- tryCatch({
        myfun(i)
    }, error=function(e) NULL)
}

或者只使用内置的 .errorhandling='remove',没有 try 应该已经消除了错误。

如果您想在foreach中使用"remove"或"pass"错误处理,您不需要自己捕获错误。以下是将错误处理设置为 "remove" 时的结果:

> foreach (i = 1:2, .errorhandling = 'remove') %dopar% {
+     myfun(i)
+ }
[[1]]
[1] 1.314854

以下是使用 "pass" 时的结果:

> foreach (i = 1:2, .errorhandling = 'pass') %dopar% {
+     myfun(i)
+ }
[[1]]
[1] 0.7247509

[[2]]
<simpleError in myfun(i): error>

通过使用 try,错误被捕获,然后由 try 函数转换为 "try-error" 对象,从 foreach 隐藏错误直到 clusterApplyLB 函数(用于实现 doParallel 后端)注意到结果列表中的 "try-error" 对象并在主进程中抛出错误。我认为这是 doParallel.

中的错误

请注意,@LegalizeIt 给出的解决方案之所以有效,是因为它 returns 是 NULL 而不是 "try-error" 对象,从而避免了 doParallel 中的错误。