メモ:...はそのまま渡すならenquos()して!!!する必要はない

tidyeval本を読んでいて知ったのでメモ。

どういうことかというと、tidyeval対応の関数をラップして可変長の引数を渡すには、こんな風にenquos()してから!!!でunquote-spliceするのがよくある感じだけど、

data(mpg, package = "ggplot2")

get_grouped_mpg <- function(...) {
  gr_vars <- rlang::enquos(...)
  
  dplyr::group_by(mpg, !!!gr_vars)
}

get_grouped_mpg(model, class)
#> # A tibble: 234 x 11
#> # Groups:   model, class [40]
#>    manufacturer model displ  year   cyl trans drv     cty   hwy fl    cla~
#>    <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <ch>
#>  1 audi         a4      1.8  1999     4 auto~ f        18    29 p     com~
#>  2 audi         a4      1.8  1999     4 manu~ f        21    29 p     com~
#>  3 audi         a4      2    2008     4 manu~ f        20    31 p     com~
#>  4 audi         a4      2    2008     4 auto~ f        21    30 p     com~
#>  5 audi         a4      2.8  1999     6 auto~ f        16    26 p     com~
#>  6 audi         a4      2.8  1999     6 manu~ f        18    26 p     com~
#>  7 audi         a4      3.1  2008     6 auto~ f        18    27 p     com~
#>  8 audi         a4 q~   1.8  1999     4 manu~ 4        18    26 p     com~
#>  9 audi         a4 q~   1.8  1999     4 auto~ 4        16    25 p     com~
#> 10 audi         a4 q~   2    2008     4 manu~ 4        20    28 p     com~
#> # ... with 224 more rows

実は...をそのまま渡すだけでよかったりする。

get_grouped_mpg_direct <- function(...) {
  dplyr::group_by(mpg, ...)
}

get_grouped_mpg_direct(model, class)
#> # A tibble: 234 x 11
#> # Groups:   model, class [40]
#>    manufacturer model displ  year   cyl trans drv     cty   hwy fl    cla~
#>    <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <ch>
#>  1 audi         a4      1.8  1999     4 auto~ f        18    29 p     com~
#>  2 audi         a4      1.8  1999     4 manu~ f        21    29 p     com~
#>  3 audi         a4      2    2008     4 manu~ f        20    31 p     com~
#>  4 audi         a4      2    2008     4 auto~ f        21    30 p     com~
#>  5 audi         a4      2.8  1999     6 auto~ f        16    26 p     com~
#>  6 audi         a4      2.8  1999     6 manu~ f        18    26 p     com~
#>  7 audi         a4      3.1  2008     6 auto~ f        18    27 p     com~
#>  8 audi         a4 q~   1.8  1999     4 manu~ 4        18    26 p     com~
#>  9 audi         a4 q~   1.8  1999     4 auto~ 4        16    25 p     com~
#> 10 audi         a4 q~   2    2008     4 manu~ 4        20    28 p     com~
#> # ... with 224 more rows

もちろん、...の中身をチェックする場合は一度enquos()でquoteする必要がある。