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

时间:2016-09-01 04:14:00

标签: r foreach error-handling warnings 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!")
    }
    

    在这种情况下,“本机”错误消息:Error in "a"/2 : non-numeric argument to binary operator未显示,只会打印来自try()错误捕获的Error!。但是,当不使用foreach()%dopar%时,将打印这两个错误消息。那么如何让两个错误信息出现?

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

    test <- function(x) {
      if (x==2) warning("Warning!")
    }
    

    那么如何显示警告?

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

    谢谢!

1 个答案:

答案 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