我正在尝试使用try()
函数来处理并行 for 循环中发生的错误:
results <- foreach (i = 1:2, .errorhandling = 'remove') %dopar% {
res <- try(myfun(i), TRUE)
}
with
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“循环”忽略错误消息(或者至少更优雅地处理它)?
如果您想在中使用“删除”或“通过”错误处理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-error”对象try
函数,隐藏错误foreach
直到clusterApplyLB
函数(用于实现doParallel
backend)注意到结果列表中的“try-error”对象,并在主进程中抛出错误。我认为这是一个错误doParallel
.
请注意,@LegalizeIt 给出的解决方案有效,因为它返回一个NULL
而不是“尝试错误”对象,从而避免了错误doParallel
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)