解析の処理
── 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()
magrittr
と native pipe
の違い
tidyverse
は magrittr
パッケージをデフォルトでつかていますが、 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 は _
です。 ところが、必ず指定した引数名に _
を渡しましょう。
Call:
lm(formula = y ~ x, data = z)
Coefficients:
(Intercept) x
-0.207 4.636
Native パイプをデフォルトに設定する
RStudio で R 4.1.0 の native
パイプ演算子を使いたいなら、Tools/Global Options/Code
の Use native pipe operator
にチェックを入れましょう。
magick::image_read("Images/part00/globalops02.png")