tryCatch со сложной функцией и plyr в R

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

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

РЕДАКТИРОВАТЬ около года спустя:foreach пакет делает это существенно проще, чем с plyr

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

2 ответа

Можете ли вы обернуть цикл try catch в функцию, которую вы передаете llply?

results = llply(1:reps, function(idx){
    out = NA
    try({ 
        out<-iteration()
    }, silent=T)
    out
},.parallel=TRUE)

Вы можете положить 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"
Другие вопросы по тегам