【发布时间】:2013-06-24 11:16:02
【问题描述】:
我必须对多个数据集进行分析。我使用 plyr (mdply) 和 doSNOW 包来使用多个内核。 有时分析代码会失败,引发错误并停止执行。我希望继续对其他数据集进行分析。如何做到这一点? 解决方案 1:编码以便捕获所有不可行的错误。 解决方案 2:一个故障安全 plyr 包装器,用于并行运行函数,返回所有有效结果,并指出哪里出了问题。
我实施了第二种解决方案(请参阅下面的答案)。棘手的部分是我想要一个函数调用来完成故障安全和返回数据帧功能。
我是如何构造函数的:
实际的函数调用用tryCatch 包装。它是从callfailsafe 函数中调用的,而这又需要将单个函数名称simple 和(...) 中的各个参数传递给整个过程。
也许我做的太复杂了……但它确实有效。
确保您的 simple 函数不依赖于任何全局定义的函数或参数,因为在与 .parallel=T 和 doSNOW 一起使用时不会加载这些函数或参数。
这是我的测试数据集:有 100 个任务。对于每个“简单”函数将被调用。但是有时该功能会失败。我通常在自动加载许多 rdata 文件进行大量处理、保存一些输出并最终返回 data.frame 对象的任务上使用它。
library(plyr)
library(doSNOW)
N=100
multiargtab= data.frame(ID=1:N,A=round(runif(N,0,1)),B=round(runif(N,0,1)))
simple=function(ID,A,B){ # a function that will sometimes fail
if(B==0) rm(B)
data.frame(A=A,B=B,AB=A/B,ID=ID)
}
调用函数的签名是:
res2=mdply.anyfun.parallel.failsafe(multiargtab,simple)
【问题讨论】:
-
你也可以用
try代替tryCatch;它更简单,通常可以满足所有要求。
标签: r parallel-processing plyr