Ich benutze lapply
Ich möchte eine komplexe Funktion für eine große Anzahl von Elementen ausführen und die Ausgabe jedes Elements (falls vorhanden) zusammen mit den erzeugten Warnungen/Fehlern speichern, damit ich feststellen kann, welches Element welche Warnung/Fehler erzeugt hat.
Ich habe einen Weg gefunden, Warnungen abzufangen, indem ich withCallingHandlers
( hier beschrieben ). Allerdings muss ich auch Fehler abfangen. Ich kann das tun, indem ich es in eine tryCatch
(wie im nachstehenden Code), aber gibt es einen besseren Weg, dies zu tun?
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)
}
Ein Beispiel für die Ausgabe dieser Funktion ist:
> 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"
Es gibt mehrere Fragen hier auf SO, die Folgendes behandeln tryCatch
und Fehlerbehandlung, aber keine, die ich gefunden habe, die dieses spezielle Problem behandeln. Siehe Wie kann ich überprüfen, ob ein Funktionsaufruf zu einer Warnung führt? , warnings() funktioniert nicht innerhalb einer Funktion? Wie kann man dies umgehen? y Wie kann man lapply anweisen, einen Fehler zu ignorieren und den nächsten Eintrag in der Liste zu bearbeiten? für die wichtigsten.