Comment dire lapply d'ignorer une erreur et traiter la chose suivante dans la liste?
-
25-09-2019 - |
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?
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 untry()
à 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"