【发布时间】:2017-07-13 18:57:31
【问题描述】:
我在使用 dplyr 编写函数时尝试使用新的 quo 功能并遇到以下问题:
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 3, 1),
a = sample(5),
b = sample(5)
)
按变量排列数据框很简单:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(!!quo_arrange_var)
}
但是如果我想设置优惠订单怎么办?例如,任何排列变量都有 2 作为顶部变量,然后正常排序。对于以前版本的 dplyr,我会使用:
arrange(-(arrange_var == 2), arrange_var)
但在新结构中,我不确定如何处理。我试过了:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!quo_arrange_var==2, !!quo_arrange_var)
}
但我得到了错误
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 5
我也尝试过使用 quo_name:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!(paste0(quo_name(quo_arrange_var), "==2")), !!quo_arrange_var)
}
但得到这个错误:
Error in arrange_impl(.data, dots) :
Evaluation error: invalid argument to unary operator.
任何帮助将不胜感激
【问题讨论】:
标签: r dplyr tidyverse rlang tidyeval