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

Posted

技术标签:

【中文标题】R:在 foreach %dopar% 中显示错误和警告消息【英文标题】:R: show error and warning messages in foreach %dopar% 【发布时间】:2017-01-08 19:28:49 【问题描述】:

我是使用 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!")
    
    

    那么如何显示警告呢?

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

谢谢!

【问题讨论】:

您可能必须告诉并行后端您想要输出(例如,如果您使用的是doSNOW,则为makeCluster 的参数outfile="")。有一个related question 提供更多详细信息。 感谢您指出解决问题的宝贵方向。我现在没有使用 doSNOW,但我正在研究... 【参考方案1】:

我认为问题在于您的错误处理以及对 dopar 的一些误解。首先,将 dopar 更像是一个函数。默认情况下,它必须将一个对象作为列表返回给用户(它收集每个工作人员的所有输出,foreach 函数收集这些并返回它们以供使用,请参见下面的“输出列表”)。

您也可以设置 .errorhandling = 'pass',它会将错误返回给输出对象(注意可能仅在 .combine ='list' 时有效)。以下是 .errorhandling 的工作原理:

.errorhandling 指定应如何处理任务评估错误。 如果值为“stop”,则执行将通过 stop 停止 发生错误时的功能。如果值为“remove”,则结果为 该任务不会被返回,也不会传递给 .combine 函数。如果 为“通过”,则任务评估产生的错误对象将 包含在其余结果中。假设 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

【讨论】:

以上是关于R:在 foreach %dopar% 中显示错误和警告消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?

R在HPC MPIcluster上运行foreach dopar循环

使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””

如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?

foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?