我正在尝试使用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.
任何帮助将不胜感激
答案 0 :(得分:1)
最简单的解决方法是将括号括在砰砰声中。这与!
和==
的运算符优先级有关。当您拥有!!a==b
时,即使您需要!!(a==b)
,也会将其解析为(!!a)==b
。由于某种原因,您可以将quosure与数值进行比较quo(a)==2
返回FALSE
,因此您的表达式正在评估arrange(-FALSE, g2)
,这会给您相同的错误消息。
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-((!!quo_arrange_var)==2), !!quo_arrange_var)
}
my_arrange(df, g2)
# # A tibble: 5 x 4
# g1 g2 a b
# <dbl> <dbl> <int> <int>
# 1 1 2 5 4
# 2 1 1 2 5
# 3 2 1 4 3
# 4 2 1 3 1
# 5 2 3 1 2