データフレーム
と 使用する変数
と 新しく合成する変数列名
を引数にもつ関数を作ったとする。
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)