我必须对多个数据集进行分析。我使用 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)