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?

È stato utile?

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top