2013-02-25 4 views
2

У меня сложная, длинная функция, которую я использую для моделирования. Он может генерировать ошибки, в основном связанные с случайными векторами, заканчивающимися равными значениями с нулевой дисперсией, получая питание либо в СПС, либо в логистических регрессиях.tryCatch со сложной функцией и plyr в R

Я выполняю его на кластере, используя doMC и 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) 

EDIT приблизительно год спустя: пакет 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" 
Смежные вопросы