首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr::filter的tidyeval方法是什么?

使用dplyr::filter的tidyeval方法是什么?
EN

Stack Overflow用户
提问于 2017-09-07 02:01:12
回答 4查看 975关注 0票数 5

使用foo(c("b"))调用下面的函数。输出以内联方式显示。

编写df %>% filter(!!x > (!!x))的正确方法是什么?

我已经提供了一个使用mutate的实例,它可以与filter进行对比。

代码语言:javascript
复制
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>

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-07 03:28:17

除了一个小错误外,大多数情况下,过滤器语句中的圆括号应该放在变量上,而不是值上。

代码语言:javascript
复制
print(df %>% filter((!!x) > !!x))

#> # A tibble: 0 x 2
#> # ... with 2 variables: a <dbl>, b <dbl>
票数 3
EN

Stack Overflow用户

发布于 2017-09-07 10:07:40

编辑:所有这些都不再适用。优先级树被重新组织,以便!!x + !!y等在默认情况下做正确的事情。从rlang 0.2.0开始,括号就不再必要了。

!运算符的优先级非常低。这意味着它将适用于其右侧出现的大多数表达式。

代码语言:javascript
复制
!! x > 3

含蓄地相当于:

代码语言:javascript
复制
(!! x > 3)

因此,您必须用显式括号帮助R确定正确的优先级:

代码语言:javascript
复制
(!! x) > 3

请注意,在大多数情况下,如果您在运算符的两边取消引用,技术上您不必在最后一个操作符上使用括号:

代码语言:javascript
复制
(!! x) + (!! y) + z

然而,这将根据通常神秘的优先级规则而有所不同,因此,我建议在涉及运算符时始终将其括在括号内:

代码语言:javascript
复制
(!! x ) + (!! y) + (!! z)
票数 2
EN

Stack Overflow用户

发布于 2017-09-07 03:08:21

您可以使用filter_at

代码语言:javascript
复制
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风格的工作原理。

代码语言:javascript
复制
oof(c("b"))

#   a b
# 1 1 2
#   a b
# 1 1 2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46086755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档