dplyrでうっかり八兵衛にならないように !! を意識する

うっかりやっちまったのでメモっておく。 まず適当な data.frame() を定義する。

> df <- data.frame(x=sample(1:2, 10, replace=TRUE), y=sample(c("a", "b"), 10, replace = TRUE))
> df
   x y
1  2 a
2  2 b
3  2 b
4  2 b
5  1 b
6  1 a
7  2 b
8  1 b
9  1 b
10 2 b

で、これを適当にFilteringしたいとするとこう書く。

> dplyr::filter(df, x == 1, y == "b")
  x y
1 1 b
2 1 b
3 1 b

そして「よくよく考えると x を変数にしておいたほうが楽そうだぞ〜」ということで以下のように書くと うっかり八兵衛になる (答えが狂う)。

> x <- 1
> dplyr::filter(df, x == x, y == "b")
  x y
1 2 b
2 2 b
3 2 b
4 1 b
5 2 b
6 1 b
7 1 b
8 2 b

正しくは以下のように rlang::!! をちゃんとかませておかないといけない。

> dplyr::filter(df, x == !!x, y == "b")
  x y
1 1 b
2 1 b
3 1 b

rlang は偉大なり、うっかりうっかり。