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

时间:2015-06-30 12:24:47

标签: r foreach parallel-processing try-catch

我正在尝试使用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“循环”忽略错误信息(或者至少更优雅地处理它)?

2 个答案:

答案 0 :(得分:12)

如果要在foreach中使用“删除”或“传递”错误处理,则无需自行捕获错误。以下是将错误处理设置为“删除”时的结果:

> 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隐藏到{{1} function(用于实现clusterApplyLB后端)注意到结果列表中的“try-error”对象,并在主进程中引发错误。我会在doParallel中将其称为错误。

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

答案 1 :(得分:5)

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

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

或仅使用内置.errorhandling='remove',如果没有try,则应删除错误。