Kiedy muszę filtrować ramkę data.frame, tzn. Wyodrębnić wiersze spełniające określone warunki, wolę użyć subset
funkcji:
subset(airquality, Month == 8 & Temp > 90)
Zamiast [
funkcji:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Są dwa główne powody mojej preferencji:
Uważam, że kod czyta się lepiej, od lewej do prawej. Nawet ludzie, którzy nie wiedzą nic o R, mogą powiedzieć, co
subset
robi powyższe stwierdzenie.Ponieważ kolumny w
select
wyrażeniu mogą być nazywane zmiennymi , mogę zapisać kilka naciśnięć klawiszy. W powyższym przykładzie musiałem pisaćairquality
tylko razsubset
, ale trzy razy[
.
Tak więc żyłem szczęśliwy, używając subset
wszędzie, ponieważ jest on krótszy i czyta się lepiej, a nawet polecam jego piękno innym znajomym koderom R. Ale wczoraj mój świat się rozpadł. Podczas czytania subset
dokumentacji zauważam ten rozdział:
Ostrzeżenie
Jest to wygodna funkcja przeznaczona do użytku interaktywnego. Do programowania lepiej jest używać standardowych funkcji podzestawu, takich jak [, aw szczególności niestandardowa ocena podzbioru argumentów może mieć nieoczekiwane konsekwencje.
Czy ktoś mógłby pomóc wyjaśnić, co mają na myśli autorzy?
Po pierwsze, co rozumieją przez „ do użytku interaktywnego ”? Wiem, czym jest sesja interaktywna, w przeciwieństwie do skryptu uruchamianego w trybie BATCH, ale nie widzę, jaką różnicę powinna ona robić.
Czy mógłbyś zatem wyjaśnić „ niestandardową ocenę podzbioru argumentów ” i dlaczego jest to niebezpieczne, może podać przykład?
dplyr::filter
ma ten sam problem. To znaczy, jeśli środowisko ma zmienną o tej nazwie, użyje jej zamiast zmiennej w ramce danych. Powoduje mylące debugowanie!
with(airquality, airquality[Month == 8 & Temp > 90, ])