vapply() vs. sapply()
W poprzednim przykładzie sapply() nie zdołało uprościć wyniku, ponieważ element date obiektu market_crash2 miał dwie klasy (POSIXct i POSIXt). Zwróć uwagę, że nie został zgłoszony żaden błąd! Gdyby jakaś funkcja zakładała, że sapply() zwróci uproszczony wektor, mogłoby to prowadzić do trudnych do wykrycia problemów.
Aby temu zaradzić, istnieje bardziej restrykcyjna funkcja apply – vapply(). Przyjmuje ona dodatkowy argument FUN.VALUE, w którym możesz określić typ i długość wyniku zwracanego przy każdym wywołaniu zastosowanej funkcji.
Jeśli oczekujesz, że class() zwróci wektor znakowy o długości 1, możesz to określić za pomocą vapply():
vapply(market_crash, class, FUN.VALUE = character(1))
dow_jones_drop date
"numeric" "Date"
Inne przykłady wartości FUN.VALUE to na przykład numeric(2) lub logical(1). Obiekt market_crash2 jest ponownie zdefiniowany i gotowy do użycia.
To ćwiczenie jest częścią kursu
R dla finansów – poziom średnio zaawansowany
Instrukcje do ćwiczenia
- Użyj ponownie
sapply(), aby znaleźćclass()elementów obiektumarket_crash2. Zwróć uwagę, że funkcja zwraca listę, a nie błąd. - Użyj
vapply()na obiekciemarket_crash2, aby znaleźćclass(). UstawFUN.VALUE = character(1). Tym razem funkcja powinna odpowiednio zgłosić błąd.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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()
___