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 は偉大なり、うっかりうっかり。