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:

g(f(x))

Operátor trubka umožní výraz přepsat do čitelnější podoby:

library(magrittr)
x %>% f() %>% g()

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/.