dplyr :: filter里面有点的滚边

时间:2017-10-13 11:01:04

标签: r dplyr tidyverse magrittr

我正努力使用%>%margritr将内容传递给dplyr中函数过滤器中的另一个参数。

我认为这应该有效:

library(dplyr)
library(margritr)

d <- data.frame(a=c(1,2,3),b=c(4,5,6))
c(2,2) %>% filter(d, a %in% .)

但我明白了:

# Error in UseMethod("filter_") : 
#  no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"

我希望它的工作方式与此相同:

filter(d, a %in% c(2,2))
#   a b
# 1 2 5

我做错了什么?

2 个答案:

答案 0 :(得分:4)

管道设计用于在传递函数时围绕其第一个参数组合函数。如果要绕过此行为,可以生成更灵活的匿名环境。你可以用花括号来做这件事,就像你写一个函数一样。

5 %>% 
  {filter(iris, Sepal.Length == .)}

为什么这样做有用,写{somefunctions(x, y)}等同于写function(...) {somefunctions(x, y)}。因此上面的函数忽略了它的参数,但只是评估其环境中的变量。 .代词由管道定义,并在全局环境中搜索其他变量(如iris)。

答案 1 :(得分:0)

默认情况下,它会传递给第一个参数。唯一的方法是明确命名第一个arg:

c(2,2) %>% 
  filter(.data = d, a %in% .)

但看起来效果不好:

  a b
1 2 5
Warning message:
In (~.) & (~a %in% .) :
  longer object length is not a multiple of shorter object length

P.S。您无需明确加载magrittr %>%

dplyr