我刚开始使用 foreach() %dopar% 进行并行,并且对于它如何处理错误或警告有一些问题。
-
当我在 foreach() %dopar% 中使用 try() 和自定义错误消息时,“本机”错误消息不会显示:
test <- function(x) {
if (x==2) "a"/2
}
foreach(i=1:3) %dopar% {
tryout <- try(test(i))
if (class(tryout)=="try-error") print("Error!")
}
在这种情况下,“本机”错误消息:Error in "a"/2 : non-numeric argument to binary operator
没有出现,并且只有Error!
将打印来自 try() 的错误捕获。但是,当不使用 foreach() %dopar% 时,将会打印这两条错误消息。那么如何让这两条错误信息同时出现呢?
-
在上述情况下,当存在警告时,无论是否附加错误,都不会打印警告消息,例如使用与上面相同的 foreach() 块和test()
below:
test <- function(x) {
if (x==2) warning("Warning!")
}
那么如何显示警告呢?
附注我发现如果我只是在 %dopar% 中使用 try(test(i)) ,那么将打印“本机”错误消息和警告,但我确实想在现实生活中包含我自己的错误消息。我也尝试过使用tryCatch()
代替try()
,但并没有解决问题。
Thanks!
我认为问题在于你的错误处理和对 dopar 的一些误解。首先,将 dopar 视为一个函数。默认情况下,它必须将一个对象作为列表返回给用户(它收集每个工作人员的所有输出,并且 foreach 函数收集这些输出并将它们返回以供使用,请参阅下面的“output_list”)。
您还可以设置 .errorhandling = 'pass',它将错误返回到输出对象(注意可能仅在 .combine ='list' 时才有效)。以下是 .errorhandling 的工作原理:
.errorhandling 指定应如何处理任务评估错误。
如果值为“stop”,则将通过stop停止执行
发生错误时起作用。如果值为“remove”,则结果为
该任务将不会被返回或传递给 .combine 函数。如果
是“pass”,那么任务评估生成的错误对象将
包含在其余结果中。假设
组合函数(如果指定)将能够处理错误
目的。默认值为“停止”。
下面是如何在 foreach 内部设置 tryCatch 的示例。请注意,错误现在存储在output_list 中。
output_list = foreach(i=1:3, .errorhandling='pass') %dopar% {
result <- tryCatch({
object_that_doesnt_exist[i]},
warning = function(war) {
return('a warning')},
error = function(err) {
return('an error')},
finally = {
return('other things')
}) # END tryCatch
return(result) # return your result to outputlist
}
output_list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)