5.6 Operátor trubka (%>%
)
Při datové analýze se často hodí používat operátor “trubka” (%>%
) definovaný v balíku magrittr (načtou jej však i některé další balíky, jako např. dplyr). RStudio zavádí pro tento operátor speciální klávesovou zkratku Ctrl-Shift-M
. Trubka umožňuje zapsat výraz se složitě zanořenými funkcemi poněkud čitelnějším způsobem. Řekněme např., že chceme na proměnnou x
aplikovat funkci f()
a na výsledek funkci g()
. Standardním způsobem bychom to provedli takto:
Operátor trubka umožní výraz přepsat do čitelnější podoby:
Tato syntaxe lépe vystihuje to, co chceme provést. Doslova říká: vezmi proměnnou x
a vlož ji jako první argument do funkce f()
. Výsledek vlož jako první argument do funkce g()
. Výraz x %>% f()
je tedy ekvivalentní výrazu f(x)
.
Funkce f()
a g()
samozřejmě mohou obsahovat i další parametry. Ty se zařadí za proměnnou x
, takže x %>% mean(na.rm = TRUE)
je ekvivalentní výrazu mean(x, na.rm = TRUE)
.
Mnoho funkcí, se kterými budeme pracovat, je přizpůsobeno používání trubek, takže data do nich vstupují jako první argument. Některé funkce však berou data na jiné pozici. V takovém případě je nutné použít speciální proměnnou tečka (.
). Do té trubka vloží vstupní data. Díky tomu je možné zapsat výraz f(y, x)
jako x %>% f(y, .)
a f(y, z = x)
jako x %>% f(y, z = .)
.
Pozor: Pokud je speciální proměnná tečka použita ve funkci přímo, pak trubka nevloží proměnnou x
na první místo ve funkci (jak jsme to viděli v předchozích případech). Pokud je však tečka použita jako součást nějakého výrazu, pak trubka proměnnou x
na první místo ve funkci vloží! To znamená, že x %>% f(y = nrow(.), z = ncol(.))
je ekvivalentní s f(x, y = nrow(x), z = ncol(x))
. Pokud tomu chcete zabránit, musíte funkci f()
uzavřít do bloku. Takže f(y = nrow(x), z = ncol(x))
musíme zapsat pomocí trubky jako x %>% {f(y = nrow(.), z = ncol(.))}
.
Podívejme se na typický příklad použití trubek. Řekněme, že máme tabulku df
(zde si ji nasimulujeme) a chceme pro každou unikátní hodnotu identifikátoru x
spočítat průměrné hodnoty proměnných y
a z
. To můžeme udělat např. takto:
library(tibble)
library(dplyr)
df <- tribble(
~x, ~y, ~z,
1, 1, 1,
1, 2, 3,
2, 3, 5,
2, 4, 6,
3, 5, 7
)
df %>% group_by(x) %>% summarize(my = mean(y), mz = mean(z))
## # A tibble: 3 x 3
## x my mz
## <dbl> <dbl> <dbl>
## 1 1 1.5 2
## 2 2 3.5 5.5
## 3 3 5 7
Detaily fungovani tohoto kodu si vysvetlime v kapitole 16. Nyní nás zajímá jen fungování trubek: proměnná df
se nejdříve vloží do funkce group_by()
a vyhodnotí se jako group_by(df, x)
. Výsledek této operace se pak vloží na první místo do funkce summarize()
a vyhodnotí se jako summarize(., my = mean(y), mz = mean(z))
, kde tečka označuje výsledek předchozího výpočtu, tj. funkce group_by()
.
Balik magrittr definuje i nektere dalsi operatory. Seznamit se s nimi muzete na webu baliku http://magrittr.tidyverse.org/ a v kapitole "Pipes" ve Wickham and Grolemund (2017) dostupne na http://r4ds.had.co.nz/pipes.html. Doporučuji však omezit se více méně jen na základní operátor %>%
.
References
Wickham, Hadley, and Garrett Grolemund. 2017. R forData Science. 1st ed. Sebastopol, California, USA: O'Reilly. http://r4ds.had.co.nz/.