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する必要がある。