library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.2
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.4      ✔ forcats 0.5.2
## Warning: package 'readr' was built under R version 4.2.3
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(nycflights13)
## Warning: package 'nycflights13' was built under R version 4.2.3
library(Lahman)
## Warning: package 'Lahman' was built under R version 4.2.3

The Pipe dalam transformasi data

Kita sering ingin menggunakan dua atau lebih fungsi transformasi secara berurutan. Misalnya, kita ingin memfilter mobil yang mpgmenempuh jarak kurang dari 20 mil per galon di jalan raya, lalu mengurutkan mobil yang tersisa menurut ukuran mesin ( displ) dalam urutan menurun. Ada beberapa cara naif untuk melakukan ini. Satu adalah:

arrange(filter(mpg, hwy >= 20), desc(displ))
## # A tibble: 156 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 chevrolet    corvette     7    2008     8 manu… r        15    24 p     2sea…
##  2 chevrolet    corvette     6.2  2008     8 manu… r        16    26 p     2sea…
##  3 chevrolet    corvette     6.2  2008     8 auto… r        15    25 p     2sea…
##  4 chevrolet    corvette     5.7  1999     8 manu… r        16    26 p     2sea…
##  5 chevrolet    corvette     5.7  1999     8 auto… r        15    23 p     2sea…
##  6 ford         mustang      5.4  2008     8 manu… r        14    20 p     subc…
##  7 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  8 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  9 pontiac      grand prix   5.3  2008     8 auto… f        16    25 p     mids…
## 10 ford         mustang      4.6  1999     8 auto… r        15    21 r     subc…
## # … with 146 more rows

Menyusun fungsi dengan cara ini sering kali bukan praktik yang baik karena akan sulit melacak tanda kurung, terutama jika Anda menumpuk beberapa fungsi. Metode yang sedikit lebih baik (namun masih belum ideal) adalah melakukan satu transformasi pada satu waktu, menyimpan hasil antara di sepanjang jalan:

filtered_mpg <- filter(mpg, hwy >= 20)
arrange(filtered_mpg, desc(cyl))
## # A tibble: 156 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…
##  2 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  3 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  4 chevrolet    corvette     5.7  1999     8 manu… r        16    26 p     2sea…
##  5 chevrolet    corvette     5.7  1999     8 auto… r        15    23 p     2sea…
##  6 chevrolet    corvette     6.2  2008     8 manu… r        16    26 p     2sea…
##  7 chevrolet    corvette     6.2  2008     8 auto… r        15    25 p     2sea…
##  8 chevrolet    corvette     7    2008     8 manu… r        15    24 p     2sea…
##  9 ford         mustang      4.6  1999     8 auto… r        15    21 r     subc…
## 10 ford         mustang      4.6  1999     8 manu… r        15    22 r     subc…
## # … with 146 more rows

Pendekatan ini menghindari penyatuan, tetapi menimbulkan redundansi: nama filtered_mpgdiperkenalkan dan kemudian segera digunakan sebagai argumen di dalam arrange. Akan jauh lebih baik untuk menggabungkan langkah-langkah ini. Untungnya, tidyverse memiliki cara untuk melakukannya dengan menggunakan konstruksi yang disebut pipe .

Pipe menyediakan cara untuk melewati kebutuhan untuk memberi nama kumpulan data perantara, hanya untuk segera memasukkannya ke dalam fungsi transformasi berikutnya sejalan. Inilah cara transformasi ganda di atas dilakukan dengan menggunakan pipe:

mpg %>%
  filter(hwy >= 20) %>%
  arrange(desc(cyl))
## # A tibble: 156 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…
##  2 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  3 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
##  4 chevrolet    corvette     5.7  1999     8 manu… r        16    26 p     2sea…
##  5 chevrolet    corvette     5.7  1999     8 auto… r        15    23 p     2sea…
##  6 chevrolet    corvette     6.2  2008     8 manu… r        16    26 p     2sea…
##  7 chevrolet    corvette     6.2  2008     8 auto… r        15    25 p     2sea…
##  8 chevrolet    corvette     7    2008     8 manu… r        15    24 p     2sea…
##  9 ford         mustang      4.6  1999     8 auto… r        15    21 r     subc…
## 10 ford         mustang      4.6  1999     8 manu… r        15    22 r     subc…
## # … with 146 more rows

Kita harus membaca ini sebagai, “Mulailah dengan mpg, masukkan ke filter, lalu masukkan hasilnya ke arrange.” Kami menghindari penyatuan dan memasukkan nama set data perantara. Operator %>%mengambil kumpulan data yang mendahuluinya dan memasukkannya ke dalam fungsi yang mengikutinya.

Pipe mengarah ke kode yang lebih jelas dan mudah dibaca, dan kami akan menggunakannya terus-menerus.