パイプ演算子の詳細

解析の処理

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.3     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.3     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

中間のオブジェクトをつくりながら、処理をする。 中間のオブジェクトの結果は参照できるのが大きなメリット。 Rコードの伝統的な組み方。

y = rnorm(50)
x = seq_along(y)
z = cbind(x,y)
plot(z)

処理内容を入れ子構造でも処理できます。 とても読みづらいが、中間オブジェクトを作る必要はない。

plot(
  cbind(
    x = seq(1, 50),
    y = rnorm(50)
  )
)

パイプ演算子を用いて処理する方法は magrittr パッケージが誕生してからできるようになりました。 このときも中間オブジェクトを作る必要はないです。 パイプ演算子の左側にある結果を右側にある関数に流し込む仕組みです。

tibble(y = rnorm(50)) |> 
  mutate(x = seq_along(y)) |> 
  plot()

magrittrnative pipe の違い

tidyversemagrittr パッケージをデフォルトでつかていますが、 R4.1.0 からは R native のパイプ演算子が導入されました。

  • magrittr / tidyverse デフォルトパイプ演算子: x %>% f()
  • R 4.1.0 native pipe : x |> f()

それぞれのパイプは右辺の関数の扱いが違いので注意しましょう。

x = rnorm(10)
y = x * 5 + rnorm(10)
z = data.frame(x, y)

magrittr パイプの場合は、 . を place holder として使えます。 つまり、左辺の値を第1引数以外の引数に渡せます。

z %>% lm(y ~ x, data = .)

Call:
lm(formula = y ~ x, data = .)

Coefficients:
(Intercept)            x  
     -0.207        4.636  

native パイプは第1引数以外の引数に渡せない。

z |> lm(y ~ x, data = . )
Error in eval(mf, parent.frame()): object '.' not found

ところが、次のように無名関数を用いて、native パイプでも magrittr パイプと同じ用なコードが作れます。

# 括弧の組み方に注意
z |> (\(dataset) lm(y ~ x, data = dataset))()

Call:
lm(formula = y ~ x, data = dataset)

Coefficients:
(Intercept)            x  
     -0.207        4.636  

UPDATE

R 4.2.0 からは native パイプにも place holder が使えるようになりました。 native パイプ演算子の place holder は _ です。 ところが、必ず指定した引数名に _ を渡しましょう。

z |> lm(y ~ x, data = _)

Call:
lm(formula = y ~ x, data = z)

Coefficients:
(Intercept)            x  
     -0.207        4.636  

Native パイプをデフォルトに設定する

RStudio で R 4.1.0 の native パイプ演算子を使いたいなら、Tools/Global Options/CodeUse native pipe operator にチェックを入れましょう。

magick::image_read("Images/part00/globalops02.png")