7

我是使用 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不会显示,并且只会Error!打印 from try() 错误捕获。然而,当不使用 foreach() %dopar% 时,两个错误信息都会被打印出来。那么如何让两个错误信息都显示出来呢?

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

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

    那么如何显示警告呢?

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

谢谢!

4

1 回答 1

9

我认为问题在于您的错误处理以及对多巴的一些误解。首先,将 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
于 2017-04-12T11:15:28.643 回答