Wie kann ich Lapply sagen, er solle einen Fehler ignorieren und das nächste in der Liste verarbeiten?

StackOverflow https://stackoverflow.com/questions/2589275

Frage

Ich habe unten eine Beispielfunktion, die in einem Datum als Zeichenfolge liest und sie als Datumsobjekt zurücksendet. Wenn es eine Zeichenfolge liest, die es nicht in ein Datum konvertieren kann, gibt es einen Fehler zurück.

testFunction <- function (date_in) {
    return(as.Date(date_in))
    }

testFunction("2010-04-06")  # this works fine
testFunction("foo")  # this returns an error

Jetzt möchte ich Lapply verwenden und diese Funktion über eine Liste von Daten anwenden:

dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction)  # this works fine

Aber wenn ich die Funktion über eine Liste anwenden möchte, wenn eine Zeichenfolge in der Mitte von zwei guten Daten einen Fehler zurückgibt, was ist der beste Weg, um damit umzugehen?

dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)

Ich nehme an, dass ich dort einen Versuch fangen möchte, aber gibt es eine Möglichkeit, den Fehler für die "FOO" -Sziel zu fangen und Lapply zu bitten, das dritte Date fortzusetzen?

War es hilfreich?

Lösung

Verwenden ein tryCatch Ausdruck um die Funktion, die die Fehlermeldung werfen kann:

testFunction <- function (date_in) {
  return(tryCatch(as.Date(date_in), error=function(e) NULL))
}

Das Schöne an der tryCatch Funktion ist, dass Sie bei einem Fehler entscheiden können, was zu tun ist (in diesem Fall zurückgeben NULL).

> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"

[[2]]
NULL

[[3]]
[1] "2010-04-08"

Andere Tipps

Man könnte versuchen, es einfach zu halten, anstatt es kompliziert zu machen:

  • Verwenden Sie das vektorisierte Datum an Parsen
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"

Sie können trivial wickeln na.omit() oder was auch immer um es herum. Oder finden Sie den Index von NAS und extrahieren Sie entsprechend aus dem Anfangsvektor oder verwenden Sie die Komplement des NAS, um die analysierten Daten zu finden, oder, oder, oder. Es ist schon alles hier.

  • Sie können Ihre machen testFunction() etwas tun. Verwenden Sie den Test dort - Wenn das zurückgegebene (analysierte) Datum na ist, tun Sie etwas.

  • Füge hinzu ein tryCatch() Block oder a try() Zu Ihrem Date analysieren.

Das ganze Dinge ist etwas seltsam, wenn Sie von einer Ein-Typ-Datenstruktur (Vektor von Chars) zu etwas anderem wechseln, aber Sie können nicht einfach Typen mischen, wenn Sie sie in einem behalten list Typ. Vielleicht musst du das überdenken.

Annahme des testFunction() ist nicht trivial und/oder dass man es nicht ändern kann, es kann in eine eigene Funktion mit einem Trycatch () -Block eingewickelt werden. Zum Beispiel:

> FaultTolerantTestFunction <- function(date_in) {
+    tryCatch({ret <- testFunction(date_in);}, error = function(e) {ret <<- NA});
+    ret
+ }
> FaultTolerantTestFunction('bozo')
[1] NA
> FaultTolerantTestFunction('2010-03-21')
[1] "2010-03-21"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top