vapply() vs. sapply()
Nell'ultimo esempio, sapply() non è riuscita a semplificare perché l'elemento date di market_crash2 aveva due classi (POSIXct e POSIXt). Nota però che non è stato generato alcun errore! Se una funzione che hai scritto si aspettasse che sapply() restituisse un vettore semplificato, questo sarebbe fuorviante.
Per gestire questo caso, esiste una funzione apply più rigorosa chiamata vapply(), che contiene un argomento aggiuntivo FUN.VALUE con cui puoi specificare il tipo e la lunghezza dell'output che deve essere restituito ogni volta che la funzione applicata viene chiamata.
Se ti aspetti che il valore restituito da class() sia un vettore di tipo character di lunghezza 1, puoi specificarlo usando vapply():
vapply(market_crash, class, FUN.VALUE = character(1))
dow_jones_drop date
"numeric" "Date"
Altri esempi di FUN.VALUE potrebbero essere numeric(2) o logical(1). market_crash2 è di nuovo definito per te.
Questo esercizio fa parte del corso
R intermedio per la finanza
Istruzioni dell'esercizio
- Usa di nuovo
sapply()per trovare laclass()degli elementi dimarket_crash2. Nota come restituisce una lista e non un errore. - Usa
vapply()sumarket_crash2per trovare laclass(). SpecificaFUN.VALUE = character(1). Dovrebbe giustamente generare un errore.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
# Market crash with as.POSIXct()
market_crash2 <- list(dow_jones_drop = 777.68,
date = as.POSIXct("2008-09-28"))
# Find the classes with sapply()
___
# Find the classes with vapply()
___