2

我有一个复杂而冗长的函数,我用它来进行模拟。它可能会产生错误,主要与以零方差相等的值结束的随机向量有关,被输入 PCA 或逻辑回归。

我正在使用doMCand的集群上执行它plyr。我不希望tryCatch函数内部的每一件小事,因为错误的可能性很多,而且每个错误的概率都很小。

我如何尝试每次运行,而不是tryCatch每条小线?代码是这样的:

iteration = function(){
    a really long simulation function where errors can happen
    }
reps = 10000
results = llply(1:reps, function(idx){out<-iteration()},.parallel=TRUE)

大约一年后编辑:foreach软件包使这比使用该软件包要容易得多plyr

library(foreach)
output <- foreach(i=1:reps, .errorhandling = 'remove')%dopar%{
  function
}
4

2 回答 2

2

你能把try catch循环包装在你传递给llply的函数中吗?

results = llply(1:reps, function(idx){
    out = NA
    try({ 
        out<-iteration()
    }, silent=T)
    out
},.parallel=TRUE)
于 2013-02-25T20:00:15.163 回答
0

您可以tryCatch在函数迭代中放入,例如:

iteration <- function(idx){
  tryCatch(
    { idx <- idx+1
      ## very long treatments here...
      ## I add a dummy error here to test my tryCatch
      if(idx %% 2000 ==0) stop("too many iterations")
    },error = function(e) print(paste('error',idx)))
}

现在在内部测试它llply

library(plyr)
reps = 10000
results = llply(1:reps, iteration,.parallel=TRUE)
1] "error 2000"
[1] "error 4000"
[1] "error 6000"
[1] "error 8000"
[1] "error 10000"
于 2013-02-25T20:20:54.393 回答