Upgrade to Pro — share decks privately, control downloads, hide ads and more …

R 4.1.0で導入された パイプ演算子 (|>)の紹介 / r_native_pipe

R 4.1.0で導入された パイプ演算子 (|>)の紹介 / r_native_pipe

パイプ演算子の処理をmagrittrパッケージが提供するものと比較しながら解説します。

Uryu Shinya

May 30, 2021
Tweet

More Decks by Uryu Shinya

Other Decks in Programming

Transcript

  1. Ͱಋೖ͞Εͨ
    ύΠϓԋࢉࢠ c
    ͷ঺հ
    Shinya Uryu
    @u_ribo uribo

    View Slide

  2. Rにおける連続した処理の記述
    パイプ演算⼦の使い⽅〜magrittrパッケージのパイプ演算⼦(%>%)との⽐較〜
    2種類のパイプ、どちらを使う?
    RStudioでのパイプ演算⼦の利⽤
    ಺༰
    1
    2
    3
    4

    View Slide

  3. 3ʹ͓͚Δ࿈ଓͨ͠ॲཧͷهड़⁞
    r

    d

    plot(d)
    処理ごとにオブジェクトへ保存する
    中間オブジェクトを残して結果を参照できる


    …不要な中間オブジェクトを発⽣させる可能性もある
    処理の流れ

    View Slide

  4. 3ʹ͓͚Δ࿈ଓͨ͠ॲཧͷهड़ 
    plot(


    matrix(


    rnorm(100),


    ncol = 2))
    処理内容を⼊れ⼦構造で記述する
    内側の結果が外側の関数に渡される


    ⼊⼒の⾯倒さ(処理順とは逆に⼊⼒する必要)


    複雑な⼊れ⼦構造だとコードの可読性の低下
    処理の流れ

    View Slide

  5. 3ʹ͓͚Δ࿈ଓͨ͠ॲཧͷهड़⁠
    library(magrittr)


    rnorm(100) %>%


    matrix(ncol = 2) %>%


    plot()
    パイプ演算⼦(%>%)を使う
    パイプから⾒て左辺の値を右辺の値(関数)に与える


    改⾏と字下げを⾏うことでコードの可読性も⾼まる
    処理の流れ

    View Slide

  6. ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    x %>% f()
    R 4.1.0 で導⼊された |> (組み込みパイプ) x |> f()
    magrittrパッケージが提供する %>%
    f(x) と等価
    左辺の値を右辺の第⼀引数に渡す
    x f()

    View Slide

  7. ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    右辺の扱いの違い
    magrittr … 関数、関数オブジェクトどちらもOK
    組み込み … 関数呼び出しでなければいけない
    x %>% f
    x |> f
    #> Error: The pipe operator requires a function call as RHS

    View Slide

  8. ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    左辺の値を第⼀引数以外に渡すためのplace holder
    magrittr … 「.」を使う
    組み込み …デフォルトではplace holderを使えない
    x %>% f(..., x = .)
    x |> f(..., x = .)
    #> Error in is.data.frame(data) : object '.' not found

    View Slide

  9. ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    関数を定義 してplace holderを実現する
    my_lm

    lm(mpg ~ cyl, data = x)


    }


    mtcars |>


    my_lm()
    または無名関数を利⽤

    View Slide

  10.         無名関数を利⽤してplace holderを実現する
    ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    mtcars |>


    (function(x) {


    lm(mpg ~ cyl, data = x)


    })()
    関数を定義または
    mtcars |>


    (\(x) lm(mpg ~ disp, data = x))()
    mtcars |>


    (\(passed_data) lm(mpg ~ disp, data = passed_data))()
    \(x) もR4.1.0で導⼊

    View Slide

  11. 試験中の機能?
    ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    Sys.setenv(`_R_USE_PIPEBIND_` = TRUE)


    mtcars |>


    . => lm(mpg ~ disp, data = .)
    => の左辺「.」が右辺の処理内で「.」として渡される
    組み込みパイプ処理でもplace holderとして機能する

    View Slide

  12. ύΠϓԋࢉࢠͷ࢖͍ํ
    ʙNBHSJUUSύοέʔδͷύΠϓԋࢉࢠ
    ͱͷൺֱʙ
    実⾏速度では組み込み > magrittr


    ユーザが違いを認識できるほどではない
    https://www.tidyverse.org/blog/2020/11/magrittr-2-0-is-here/
    f1

    f2

    f3

    f4

    p

    bench::mark(


    `1` = NULL %>% f1(),


    `4` = NULL %>% f1() %>% f2() %>% f3() %>% f4(),


    `1_native` = NULL |> f1(),


    `4_native` = NULL |> f1() |> f2() |> f3() |> f4())
    組み込み
    組み込み
    magrittr
    magrittr

    View Slide

  13. 34UVEJPͰͷύΠϓԋࢉࢠͷར༻
    ショートカット
    ⌘Command ⇧Shift M
    ^Control ⇧Shift M
    Windows
    + +
    + +

    View Slide

  14. 34UVEJPͰͷύΠϓԋࢉࢠͷར༻
    組み込みパイプのショートカットを利⽤するには
    👉
    ※2021年5⽉30⽇現在は


    Preview, Daily Buildでのみ利⽤可能
    メニュー
    Preferences...
    Code
    |>
    |>
    の順に選択した画⾯
    チェック

    View Slide

  15. छྨͷύΠϓɺͲͪΒΛ࢖͏
    magrittr (%>%) 組み込み (|>)
    R 4.1.0以上縛り
    パッケージのインストール
    導⼊しやすさ
    実⾏速度
    place holder
    magrittrをImportしたパッケージが多数
    知名度
    v2.0で改善 magrittrより⾼速
    「.」を指定する 関数を定義する
    特にtidyverseユーザ
    ⾼い
    まだ低い

    View Slide