2016-01-20 2 views
1

Answer to question about error handling with lapply всегда возвращают NA или NULL когда элемент выходит из строя, то естьобращения с lapply Ошибка - выход индекса отказавших элементов

myfun <- function(s) { 
    tryCatch(doSomething(s), error = function(e) { return(NULL) } 
} 

Однако этого не достаточно общий характер, поскольку doSomething(s) может возвращать NULL или сам NA. Поэтому в идеале я хочу написать myfun так, что после lapply(mylist, myfun) я могу как-то получить все индексы неудачных элементов. Как это сделать?

ответ

2

Поймать и отпустить ошибку, передав его с identity()

res = lapply(list(1, "two", 3), function(i) tryCatch({ 
    sqrt(i) 
}, error=identity) 

Проверка на наличие ошибок

vapply(res, is, logical(1), "error") 

Вернувшиеся состояние ошибки часто лучше возвращать «волшебную» значение как NA или NULL, если анализ нисходящего потока не будет работать с возвратом значения.

В качестве более продвинутого решения, создать более сложные условия или расширить класс ошибок

my_condition = function(err) 
    structure(list(message=conditionMessage(err), 
        original=err), class=c("my", "condition")) 

и вернуться, что

res <- lapply(list(1, "two", 3), function(i) { 
    tryCatch({ 
     sqrt(i) 
    }, error=my_condition) 
})