Come a dire lapply di ignorare un errore ed elaborare la prossima cosa nella lista?
-
25-09-2019 - |
Domanda
Ho un esempio di funzione di sotto di tale legge in una data come una stringa e la restituisce come un oggetto data. Se si legge una stringa che non può convertire in una data, restituisce un errore.
testFunction <- function (date_in) {
return(as.Date(date_in))
}
testFunction("2010-04-06") # this works fine
testFunction("foo") # this returns an error
Ora, io voglio usare lapply e applicare questa funzione su un elenco di date:
dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction) # this works fine
Ma se voglio applicare la funzione su un elenco quando una corda in mezzo a due date buone restituisce un errore, qual è il modo migliore per affrontare questo?
dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)
Presumo che voglio un tentativo di cattura in là, ma c'è un modo per catturare l'errore per la stringa "pippo", mentre chiedendo lapply di continuare e leggere il terzo appuntamento?
Soluzione
Usa un'espressione tryCatch
intorno alla funzione che può lanciare il messaggio di errore:
testFunction <- function (date_in) {
return(tryCatch(as.Date(date_in), error=function(e) NULL))
}
La cosa bella sulla funzione tryCatch
è che si può decidere cosa fare in caso di errore (in questo caso, NULL
ritorno).
> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"
[[2]]
NULL
[[3]]
[1] "2010-04-08"
Altri suggerimenti
Si potrebbe cercare di mantenere le cose semplici, piuttosto che per rendere più complicato:
- Utilizza la data parsing Vectorised
R> as.Date( c("2010-04-06", "foo", "2010-04-08") ) [1] "2010-04-06" NA "2010-04-08"
È possibile banalmente avvolgere na.omit()
o qualsiasi altra cosa intorno ad esso. O trovare l'indice di AN ed estrarre conseguenza dal vettore iniziale, o utilizzare il complemento del NAS per trovare le date analizzata, o, o, o. E 'tutto già qui.
-
Si può rendere il vostro
testFunction()
fare qualcosa. Utilizzare il test c'è -. Se la (analizzato) Data restituito è NA, fare qualcosa -
Aggiungi un blocco o un
tryCatch()
try()
della data di analisi.
Le cose integrali è un po 'strano come si va da una struttura di dati di un tipo (vettore di caratteri) a qualcos'altro, ma non si può mescolare facilmente i tipi meno che non li tieni in un tipo list
. Così forse è necessario ripensare questo.
Supponendo che il testFunction()
non è banale e / o che non si può modificare, esso può essere avvolto in una funzione della propria, con un blocco TryCatch (). Ad esempio:
> 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"