R 中 foreach() 中的 try() 问题
Problems with try() inside foreach() in R
我正在尝试使用 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 "loop" 忽略错误消息(或者至少更优雅地处理它)?
您可以使用tryCatch
并适当处理错误。这里忽略错误(返回NULL)
results <- foreach (i = 1:2) %dopar% {
res <- tryCatch({
myfun(i)
}, error=function(e) NULL)
}
或者只使用内置的 .errorhandling='remove'
,没有 try
应该已经消除了错误。
如果您想在foreach
中使用"remove"或"pass"错误处理,您不需要自己捕获错误。以下是将错误处理设置为 "remove" 时的结果:
> 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
隐藏错误直到 clusterApplyLB
函数(用于实现 doParallel
后端)注意到结果列表中的 "try-error" 对象并在主进程中抛出错误。我认为这是 doParallel
.
中的错误
请注意,@LegalizeIt 给出的解决方案之所以有效,是因为它 returns 是 NULL
而不是 "try-error" 对象,从而避免了 doParallel
中的错误。
我正在尝试使用 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 "loop" 忽略错误消息(或者至少更优雅地处理它)?
您可以使用tryCatch
并适当处理错误。这里忽略错误(返回NULL)
results <- foreach (i = 1:2) %dopar% {
res <- tryCatch({
myfun(i)
}, error=function(e) NULL)
}
或者只使用内置的 .errorhandling='remove'
,没有 try
应该已经消除了错误。
如果您想在foreach
中使用"remove"或"pass"错误处理,您不需要自己捕获错误。以下是将错误处理设置为 "remove" 时的结果:
> 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
隐藏错误直到 clusterApplyLB
函数(用于实现 doParallel
后端)注意到结果列表中的 "try-error" 对象并在主进程中抛出错误。我认为这是 doParallel
.
请注意,@LegalizeIt 给出的解决方案之所以有效,是因为它 returns 是 NULL
而不是 "try-error" 对象,从而避免了 doParallel
中的错误。