Question

J'ai une fonction d'exemple ci-dessous qui lit une date comme une chaîne et retourne comme objet date. Si elle lit une chaîne qu'il ne peut pas se convertir à une date, il renvoie une erreur.

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

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

Maintenant, je veux utiliser lapply et appliquer cette fonction sur une liste de dates:

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

Mais si je veux appliquer la fonction sur une liste quand une chaîne au milieu de deux bonnes dates renvoie une erreur, quelle est la meilleure façon de régler ce problème?

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

Je suppose que je veux une prise d'essai là-bas, mais est-il un moyen d'attraper l'erreur pour la chaîne « foo » tout en demandant lapply de continuer et de lire la troisième date?

Était-ce utile?

La solution

Utilisez une expression de tryCatch autour de la fonction qui peut renvoyer le message d'erreur:

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

La bonne chose à propos de la fonction tryCatch est que vous pouvez décider quoi faire dans le cas d'une erreur (dans ce cas, le retour NULL).

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

[[2]]
NULL

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

Autres conseils

On pourrait essayer de garder les choses simples plutôt que de le rendre complexe:

  • Utilisez l'analyse syntaxique la date vectorisée
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"

Vous pouvez trivialement envelopper na.omit() ou tout autour d'elle. Ou trouver l'indice de NAs et extraire en conséquence à partir du vecteur initial ou utiliser le complément du NAs pour trouver les dates analysable, ou, ou, ou. Il est tout ici déjà.

  • Vous pouvez faire votre testFunction() faire quelque chose. Utilisez le test là-bas -. Si la date de retour (analysable) est NA, faire quelque chose

  • Ajouter un bloc tryCatch() ou un try() à votre analyse syntaxique de la date.

L'ensemble des choses est un peu étrange que vous passez d'une structure de données d'un type (vecteur de caractères) à quelque chose d'autre, mais vous ne pouvez pas mélanger facilement les types à moins que vous les garder dans un type de list. vous devez alors peut-être à repenser.

En supposant que le testFunction() n'est pas trivial et / ou que l'on ne peut pas le modifier, il peut être enveloppé dans une fonction de votre propre, avec un bloc TryCatch (). Par exemple:

> 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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top