在dplyr 0.7.1中排列函数
我试图在使用dplyr编写函数时使用新的quo功能,但遇到以下问题:在dplyr 0.7.1中排列函数,r,dplyr,tidyverse,rlang,tidyeval,R,Dplyr,Tidyverse,Rlang,Tidyeval,我试图在使用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 <- 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, !!quo_arrange_var)
}
我也尝试过使用“你”这个名字:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!(paste0(quo_name(quo_arrange_var), "==2")), !!quo_arrange_var)
}
任何帮助都将不胜感激最简单的修复方法是在爆炸声周围加上括号。这与运算符相对于
的优先级有关代码>和==
。当你有!!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
myu\u
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 5
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.
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