4

私は dplyr 動詞を使用する関数を書きたいと思っていますrlang

purrr::map_df()具体的な例を提供するために、 a内の変数を反復処理するために使用したいとしますdplyr::group_by()。dplyr vignette を使用したプログラミングではmy_summarise()、関数を作成します。rlang::enquo()グループ化変数で使用し、で引用符を外すアプローチがあり!!ます。my_summarise(df, g1)このアプローチは、引用符で囲まれていない変数名 (ビネット内)を取る新しい dplyr のような関数を作成するために機能します。

対照的に、変数名を文字列として提供したいと思います。rlang::sym()これを行う正しい方法はありますか?sym()dplyr プログラミング ビネットでは言及されておらず、rlang tidy 評価記事でもほとんど言及されていないため、そうではないようです。より良い方法はありますか?

library(tidyverse)
my_summarise <- function(df, group_var) {
  group_var <- rlang::sym(group_var)

  df %>%
    group_by(!!group_var) %>%
    summarise(mpg = mean(mpg))
}

# This works. Is that a good thing?
purrr::map_df(c("cyl", "am"), my_summarise, df = mtcars)

# A tibble: 5 x 3
    cyl   mpg    am
  <dbl> <dbl> <dbl>
1  4.00  26.7 NA   
2  6.00  19.7 NA   
3  8.00  15.1 NA   
4 NA     17.1  0   
5 NA     24.4  1.00

フォローアップとして、(最初にenquoorを適用せずにsym) 引用符を外すだけでうまくいくことがあるのはなぜですか? 以下の例で、select()期待どおりに動作するのに、そうでないのはなぜgroup_by()ですか?

x <- "cyl"
select(mtcars, !!x)
group_by(mtcars, !!x)

更新: 答えは引用符を外すことではありません。selectより柔軟で、文字列を処理できますが、処理できgroup_byません。

その他の参照: Edwin Thoen によるこのブログ投稿。

4

1 に答える 1