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.
您可以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应该删除错误.