我是使用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
未显示,只会打印来自try()错误捕获的Error!
。但是,当不使用foreach()%dopar%时,将打印这两个错误消息。那么如何让两个错误信息出现?
在上述情况下,当有警告时,无论是否有错误,都不会打印警告消息,例如使用与上面相同的foreach()块和下面的test()
:
test <- function(x) {
if (x==2) warning("Warning!")
}
那么如何显示警告?
P.S。我发现,如果我只是在%dopar%内使用try(test(i)),那么将打印“本机”错误消息和警告,但我确实想在现实生活中包含我自己的错误消息。我也尝试使用tryCatch()
代替try()
,但它没有解决问题。
谢谢!
答案 0 :(得分:6)
我认为问题在于您的错误处理和对多巴的一些误解。首先,将多巴视为一种功能。默认情况下,它必须将对象返回给用户作为列表(它收集每个worker的所有输出,foreach函数收集这些并返回使用它们,请参阅下面的'output_list')。
你也可以设置.errorhandling ='pass',它会将错误返回给输出对象(注意可能仅在.combine ='list'时有效)。以下是.errorhandling的工作原理:
.errorhandling指定应如何处理任务评估错误。 如果值为“停止”,则将通过停止执行 如果发生错误则起作用。如果值为“remove”,则结果为 该任务不会被返回,也不会传递给.combine函数。如果 它是“通过”,然后由任务评估生成的错误对象将 包含在其余结果中。假设是 组合功能(如果指定)将能够处理错误 宾语。默认值为“停止”。
以下是如何在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