Pregunta

Tengo una función de ejemplo a continuación que se lee en una fecha como una cadena y la devuelve como un objeto de fecha. Si lee una cadena que no puede convertir a una fecha, devuelve un error.

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

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

Ahora, quiero usar LAPPLY y aplicar esta función en una lista de fechas:

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

Pero si quiero aplicar la función en una lista cuando una cadena en medio de dos buenas fechas devuelve un error, ¿cuál es la mejor manera de lidiar con esto?

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

Supongo que quiero un intento de atrapar allí, pero ¿hay alguna manera de detectar el error para la cadena "foo" mientras pide a Lapply que continúe y lea la tercera fecha?

¿Fue útil?

Solución

Utilizar una tryCatch Expresión alrededor de la función que puede lanzar el mensaje de error:

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

Lo bueno del tryCatch La función es que puede decidir qué hacer en el caso de un error (en este caso, retorno NULL).

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

[[2]]
NULL

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

Otros consejos

Uno podría tratar de mantenerlo simple en lugar de complicarlo:

  • Use el análisis de la fecha vectorizada
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"

Puedes envolver trivialmente na.omit() o lo que sea a su alrededor. O encuentre el índice de NAS y extraiga en consecuencia del vector inicial, o use el complemento del NAS para encontrar las fechas analizadas, o, o, o. Ya está todo aquí.

  • Puedes hacer tu testFunction() hacer algo. Use la prueba allí: si la fecha devuelta (analizada) es NA, haga algo.

  • Agrega un tryCatch() bloque o un try() a tu cita analizado.

Las cosas enteras son un poco extrañas a medida que pasa de una estructura de datos de un tipo (vector de caracteres) a otra cosa, pero no puede mezclar fácilmente tipos a menos que los mantenga en un list escribe. Entonces, tal vez necesite repensar esto.

Asumiendo el testFunction() no es trivial y/o que no se puede alterar, se puede envolver en una función propia, con un bloque de trycatch (). Por ejemplo:

> 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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top