ggplotでNSE処理

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)

などとすればよい。