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%””