2013-02-25 45 views
2

我有一個複雜的,我用來做模擬的長函數。它可能會產生錯誤,主要是隨機向量與零方差結果相等的值,從而導致PCA或邏輯迴歸。tryCatch具有複雜的功能和plyr在R

我正在羣集上使用doMCplyr執行它。我不希望tryCatch函數中的每一件小事情,因爲錯誤的可能性很多,並且它們中的每一個的概率都很小。

我該如何嘗試抓住每一次運行,而不是tryCatch ing每一個小行?該代碼是這樣的:

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 
} 

回答

2

你可以用的嘗試捕捉環路你傳遞給llply的函數?

results = llply(1:reps, function(idx){ 
    out = NA 
    try({ 
     out<-iteration() 
    }, silent=T) 
    out 
},.parallel=TRUE) 
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"