dplyrのリニューアル版では、filter_などの関数のアンダースコアバージョンは、tidy evaluationになります。dplyr tidyevalに相当するアンダースコア関数のバージョン
新しい方法で期待される新しいアンダースコアフォームはどんなものですか? R CMDチェックで未定義シンボルを回避する方法を書いていますか?
library(dplyr)
df <- data_frame(id = rep(c("a","b"), 3), val = 1:6)
df %>% filter_(~id == "a")
# want to avoid this, because it references column id in a variable-style
df %>% filter(id == "a")
# option A
df %>% filter(UQ(rlang::sym("id")) == "a")
# option B
df %>% filter(UQ(as.name("id")) == "a")
# option C
df %>% filter(.data$id == "a")
優先フォームがありますか?オプションCは最短ですが、私の現実世界の大規模なデータセットと、より複雑なdplyr構築物の一部に遅い:
microbenchmark(
sym = dsPClosest %>%
group_by(!!sym(dateVarName), !!sym("depth")) %>%
summarise(temperature = mean(!!sym("temperature"), na.rm = TRUE)
, moisture = mean(!!sym("moisture"), na.rm = TRUE)) %>%
ungroup()
,data = dsPClosest %>%
group_by(!!sym(dateVarName), .data$depth) %>%
summarise(temperature = mean(.data$temperature , na.rm = TRUE)
, moisture = mean(.data$moisture , na.rm = TRUE)) %>%
ungroup()
,times=10
)
#Unit: milliseconds
# expr min lq mean median uq max neval
# sym 80.05512 84.97267 122.7513 94.79805 100.9679 392.1375 10
# data 4652.83104 4741.99165 5371.5448 5039.63307 5471.9261 7926.7648 10
別answer for mutate_は、さらに複雑な構文を使用してあります。
私は 'utils :: globalVariables()'を使用して、dplyr式で使用しているすべての変数名を登録します。 – lionel
seplyrパッケージを見てください。 –