R:在foreach%dopar%中显示错误和警告消息

Ken*_*eng 6 error-handling foreach warnings r doparallel

我是使用foreach()%dopar%进行并行的新手,我对如何处理错误或警告有一些问题.

  1. 当我在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%时,将打印这两个错误消息.那么如何让两个错误信息都显示出来?

  2. 在上述情况下,当有警告时,无论是否有错误,都不会打印警告消息,例如使用与上面和test()下面相同的foreach()块:

    test <- function(x) {
      if (x==2) warning("Warning!")
    }
    
    Run Code Online (Sandbox Code Playgroud)

    那么如何显示警告?

ps我发现,如果我只是在%dopar%内使用try(test(i)),那么将打印"本机"错误消息和警告,但我确实想在现实生活中包含我自己的错误消息.我也尝试使用tryCatch()而不是try(),但它没有解决问题.

谢谢!

mma*_*123 6

我认为问题在于你的错误处理和对多巴的一些误解.首先,将多巴视为一种功能.默认情况下,它必须将对象返回给用户作为列表(它收集每个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)