NSE処理で変数列名を柔軟に変更

データフレーム使用する変数新しく合成する変数列名 を引数にもつ関数を作ったとする。

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

  # varを2倍した新しい変数 `new_var` を作る
  .d <- data %>% 
    select(!!var) %>% 
    mutate(!!new_var := !!var * 2)
  
  # 出力
  return(.d)
}

f(data = iris, var = Sepal.Length, new_var = 'Sepal.Length*2')

実行するとこうなる。

  Sepal.Length Sepal.Length*2
1          5.1           10.2
2          4.9            9.8
3          4.7            9.4
4          4.6            9.2
5          5.0           10.0
6          5.4           10.8

これはこれでいいのだが、 Sepal.Length 以外の変数を指定した場合、それに合わせて新合成した変数列名も Sepal.Length*2 から柔軟に変化させないといけない。できれば、 var で指定した変数名を使って、 new_var を定義すればよいだろう。というわけで改良版はこちら。

f <- function(data, var) {
  
  # NSE処理
  var <- rlang::enquo(var)
  new_var <- str_c(rlang::quo_name(var), '*2')
  
  # varを2倍した新しい変数 `new_var` を作る
  .d <- data %>% 
    select(!!var) %>% 
    mutate(!!new_var := !!var * 2)
  
  # 出力
  return(.d)
}

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

enquo した変数を quo_name() してあげればよい。

filter のときは

data %>% 
    filter(!!rlang::sym(var) == XX)