Ken*_*eng 6 error-handling foreach warnings r doparallel
我是使用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!")
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"本机"错误消息:Error in "a"/2 : non-numeric argument to binary operator不会显示,只会Error!打印来自try()错误捕获.但是,当不使用foreach()%dopar%时,将打印这两个错误消息.那么如何让两个错误信息都显示出来?
在上述情况下,当有警告时,无论是否有错误,都不会打印警告消息,例如使用与上面和test()下面相同的foreach()块:
test <- function(x) {
if (x==2) warning("Warning!")
}
Run Code Online (Sandbox Code Playgroud)
那么如何显示警告?
ps我发现,如果我只是在%dopar%内使用try(test(i)),那么将打印"本机"错误消息和警告,但我确实想在现实生活中包含我自己的错误消息.我也尝试使用tryCatch()而不是try(),但它没有解决问题.
谢谢!
我认为问题在于你的错误处理和对多巴的一些误解.首先,将多巴视为一种功能.默认情况下,它必须将对象返回给用户作为列表(它收集每个worker的所有输出,foreach函数收集这些并返回使用它们,请参阅下面的'output_list').
你也可以设置.errorhandling ='pass',它会将错误返回给输出对象(注意可能仅在.combine ='list'时有效).以下是.errorhandling的工作原理:
.errorhandling指定应如何处理任务评估错误.如果值为"stop",则如果发生错误,将通过stop函数停止执行.如果值为"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
Run Code Online (Sandbox Code Playgroud)