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

sla*_*ess 14 parallel-processing foreach r try-catch

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

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

myfun <- function(i){
    if (i==1) return(rnorm(1))
    else stop('error')
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息

Error in checkForRemoteErrors(val) : 
  one node produced an error: Error in myfun(i) : error
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ton 12

如果要使用"删除"或"传递"错误处理foreach,则不需要自己捕获错误.以下是将错误处理设置为"删除"时的结果:

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

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

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

[[2]]
<simpleError in myfun(i): error>
Run Code Online (Sandbox Code Playgroud)

通过使用try,错误被捕获,然后被try函数转换为"try-error"对象,隐藏错误foreach直到clusterApplyLB函数(用于实现doParallel后端)注意到列表中的"try-error"对象结果并在主进程中引发错误.我会称那是一个错误doParallel.

请注意@LegalizeIt给出的解决方案是有效的,因为它返回一个NULL而不是"try-error"对象,从而避免了错误doParallel.


pic*_*ick 5

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

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

或者只是使用内置的.errorhandling='remove',没有try应该删除错误.