NSE処理について

引数に データフレームデータフレーム中の変数 を指定可能な自作関数を作りたいときがある。 例えば、

iris %>% select(Sepal.Length)

という超簡単な処理を Sepal.Length 以外の変数でも使えるように、この処理を関数化してみよう。直感的にはこんな風に書きたくなるはず。

f <- function(data, var) {
  
  # データフレーム内のvarという変数を選択
  .d <- data %>% select(var)
  
  # 出力
  return(.d)
}

f(data = iris, var = Sepal.Length)

しかし、これだと上手く動かない。NSE処理のせいである。こうすればうまくいく。

f <- function(data, var) {
  
  # NSE処理
  var <- rlang::enquo(var)
  var_label <- rlang::as_label(var)

  # データフレーム内のvarという変数を選択
  .d <- data %>% select(!!var_label)
  
  # 出力
  return(.d)
}

f(data = iris, var = Sepal.Length)

これで動くはず。

雰囲気で理解するtidy evaluation(1): tidy evaluationの導入 - Qiita

読書日記: Rのdplyrパッケージでプログラミングするときの注意点