¿Cómo guardo advertencias y errores como salida de una función?

Estoy usandolapply para ejecutar una función compleja en una gran cantidad de elementos, y me gustaría guardar el resultado de cada elemento (si corresponde) junto con cualquier advertencia / error que se haya producido para poder determinar qué elemento produjo qué advertencia / error.

Encontré una manera de atrapar advertencias usandowithCallingHandlers (descrito aquí) Sin embargo, también necesito detectar errores. Puedo hacerlo envolviéndolo en untryCatch (como en el código a continuación), pero ¿hay una mejor manera de hacerlo?

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)
} 

La salida de muestra de esta función es:

> 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"

Aquí hay varias preguntas sobre SO que discutentryCatch y manejo de errores, pero ninguno que encontré que aborde este problema en particular. Ver¿Cómo puedo verificar si una llamada a función genera una advertencia?, warnings () no funciona dentro de una función? ¿Cómo se puede evitar esto?y¿Cómo decirle a lapply que ignore un error y procese lo siguiente en la lista? para los más relevantes

Respuestas a la pregunta(4)

Su respuesta a la pregunta