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"