使用foo(c("b"))调用下面的函数。输出以内联方式显示。
编写df %>% filter(!!x > (!!x))的正确方法是什么?
我已经提供了一个使用mutate的实例,它可以与filter进行对比。
foo <- function(variables) {
x <- rlang::sym(variables[[1]])
print(x)
#> b
print(typeof(x))
#> [1] "symbol"
df <- data_frame(a = 1, b = 2)
print(df %>% mutate(!!x := 100 + !!x))
#> # A tibble: 1 x 2
#> a b
#> <dbl> <dbl>
#> 1 1 102
print(df %>% filter(!!x > (!!x)))
#> Error in !x : invalid argument type
print(df %>% filter(magrittr::is_greater_than(!!x, !!x)))
#> # A tibble: 0 x 2
#> # ... with 2 variables: a <dbl>, b <dbl>
}发布于 2017-09-07 03:28:17
除了一个小错误外,大多数情况下,过滤器语句中的圆括号应该放在变量上,而不是值上。
print(df %>% filter((!!x) > !!x))
#> # A tibble: 0 x 2
#> # ... with 2 variables: a <dbl>, b <dbl>发布于 2017-09-07 10:07:40
编辑:所有这些都不再适用。优先级树被重新组织,以便!!x + !!y等在默认情况下做正确的事情。从rlang 0.2.0开始,括号就不再必要了。
!运算符的优先级非常低。这意味着它将适用于其右侧出现的大多数表达式。
!! x > 3含蓄地相当于:
(!! x > 3)因此,您必须用显式括号帮助R确定正确的优先级:
(!! x) > 3请注意,在大多数情况下,如果您在运算符的两边取消引用,技术上您不必在最后一个操作符上使用括号:
(!! x) + (!! y) + z然而,这将根据通常神秘的优先级规则而有所不同,因此,我建议在涉及运算符时始终将其括在括号内:
(!! x ) + (!! y) + (!! z)发布于 2017-09-07 03:08:21
您可以使用filter_at
oof <- function(variables) {
x <- rlang::sym(variables[[1]])
df <- data.frame(a = 1, b = 2)
print(df %>% filter_at(vars(!!x), any_vars(. == !!x)))
print(df %>% filter(magrittr::equals(!!x, !!x)))
}我使用magrittr::equals来显示magrittr风格的工作原理。
oof(c("b"))
# a b
# 1 1 2
# a b
# 1 1 2https://stackoverflow.com/questions/46086755
复制相似问题