Возможно, это то же самое, что и ваше решение, но я написал factory
для преобразования простых старых функций в функции, которые фиксируют их значения, ошибки и предупреждения, поэтому я могу
test <- function(i)
switch(i, "1"=stop("oops"), "2"={ warning("hmm"); i }, i)
res <- lapply(1:3, factory(test))
с каждымэлемент результата, содержащий значение, ошибку и / или предупреждения.Это будет работать с пользовательскими функциями, системными функциями или анонимными функциями (factory(function(i) ...)
).Вот фабрика
factory <- function(fun)
function(...) {
warn <- err <- NULL
res <- withCallingHandlers(
tryCatch(fun(...), error=function(e) {
err <<- conditionMessage(e)
NULL
}), warning=function(w) {
warn <<- append(warn, conditionMessage(w))
invokeRestart("muffleWarning")
})
list(res, warn=warn, err=err)
}
и несколько помощников для работы со списком результатов
.has <- function(x, what)
!sapply(lapply(x, "[[", what), is.null)
hasWarning <- function(x) .has(x, "warn")
hasError <- function(x) .has(x, "err")
isClean <- function(x) !(hasError(x) | hasWarning(x))
value <- function(x) sapply(x, "[[", 1)
cleanv <- function(x) sapply(x[isClean(x)], "[[", 1)