【发布时间】:2015-02-16 10:45:44
【问题描述】:
这是我用于错误处理的常见结构:
x <- tryCatch(foo(), error=function(e){
warning(e)
NULL})
我对大量数据对象运行 foo,其中一些可能由于某种原因而失败,如果是这样,我希望结果为 NULL,这样我的整个运行就不会停止,但我也希望得到警告,所以我可以看到失败的原因和原因。
我经常像这样从 plyr 运行这些,假设其中一些失败:
x <- llply(1:4, .fun=function(i) {
result<-tryCatch({
if(i %% 2==0) stop(i)
i}, error=function(e) {
warning(e)
NULL})
result})
x
结果:
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) : 2
2: In doTryCatch(return(expr), name, parentenv, handler) : 4
> x
[[1]]
[1] 1
[[2]]
NULL
[[3]]
[1] 3
[[4]]
NULL
但是,假设我使用相同的代码打开并行计算。
require(doParallel)
registerDoParallel(cores=4)
x <- llply(1:4, .parallel=TRUE, .fun=function(i) {
result<-tryCatch({
if(i %% 2==0) stop(i)
i}, error=function(e) {
warning(e)
NULL})
result})
Result:
Error in do.ply(i) : task 2 failed - "2"
作业因任何任务中的错误而失败,并且没有构造任何结果。警告(e)以某种方式转换为错误。我可以通过注释掉警告(e)来解决这个问题,然后当出现错误时,我会在我的数据结构中获得所需的 NULL 结果,但随后我会丢失有关所发生情况的信息。
事实上,我不知道从并行 plyr 抛出警告的任何好方法。他们似乎被压制了。如果这是并行性的限制,那是有道理的。但我认为警告变成错误行为很奇怪,我想了解这里发生了什么。
【问题讨论】:
标签: r error-handling parallel-processing try-catch plyr