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