Como salvar avisos e erros como saída de uma função?

estou a usarlapply para executar uma função complexa em um grande número de itens e gostaria de salvar a saída de cada item (se houver), juntamente com os avisos / erros que foram produzidos, para que eu possa saber qual item produziu qual aviso / erro.

Encontrei uma maneira de capturar avisos usandowithCallingHandlers (descrito aqui) No entanto, eu preciso pegar erros também. Eu posso fazer isso envolvendo-o em umtryCatch (como no código abaixo), mas existe uma maneira melhor de fazer isso?

catchToList <- function(expr) {
  val <- NULL
  myWarnings <- NULL
  wHandler <- function(w) {
    myWarnings <<- c(myWarnings, w$message)
    invokeRestart("muffleWarning")
  }
  myError <- NULL
  eHandler <- function(e) {
    myError <<- e$message
    NULL
  }
  val <- tryCatch(withCallingHandlers(expr, warning = wHandler), error = eHandler)
  list(value = val, warnings = myWarnings, error=myError)
} 

A amostra de saída desta função é:

> catchToList({warning("warning 1");warning("warning 2");1})
$value
[1] 1

$warnings
[1] "warning 1" "warning 2"

$error
NULL

> catchToList({warning("my warning");stop("my error")})
$value
NULL

$warnings
[1] "my warning"

$error
[1] "my error"

Existem várias perguntas aqui no SO que discutemtryCatch e tratamento de erros, mas nenhum que encontrei que resolvesse esse problema em particular. VejoComo posso verificar se uma chamada de função resulta em um aviso?, warnings () não funciona em uma função? Como se pode contornar isso?eComo dizer ao lapply para ignorar um erro e processar a próxima coisa na lista? para os mais relevantes.

questionAnswers(4)

yourAnswerToTheQuestion