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

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

    那么如何显示警告呢?

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

谢谢!

【问题讨论】:

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

标签: r foreach error-handling warnings doparallel


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2021-06-25
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多