ggplotで変数を柔軟に変更できるような自作関数を作りたくなったら、やはりNSE処理が必要になる。例えば、あるデータフレームを使用して、そのデータフレーム中の2つの変数を指定し、散布図を描きたいとしよう。
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width))
これを関数化しようとすると、直感的にはこう書けるはず。
f_gg <- function(data, var_1, var_2) { .p <- ggplot(data = data) + geom_point(aes(x = var_1, y = var_2)) return(.p) } f_gg(data = iris, var_1 = Sepal.Length, var_2 = Sepal.Width)
しかし、これではやはり動かない。こう修正するとうまく動く。
f_gg <- function(data, var_1, var_2) { var_1 <- rlang::enquo(var_1) var_2 <- rlang::enquo(var_2) var_label_1 <- rlang::as_label(var_1) var_label_2 <- rlang::as_label(var_2) .p <- ggplot(data = data) + geom_point(aes_(x = var_1, y = var_2)) return(.p) } f_gg(data = iris, var_1 = Sepal.Length, var_2 = Sepal.Width)
aes
ではなく aes_
をつかって、 enquo
した変数を指定すればいい。
ちなみに、 ggtitle
でタイトルを付けたいときは
.p <- ggplot(data = data) + geom_point(aes_(x = var_1, y = var_2)) + ggtitle(var_1)
などとすればよい。