2017-10-13 74 views
2

我从dplyr使用%>%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

我认为这是管是如何设计的,即,它把以前输出到下一个函数的第一个参数。你可能会需要更明确的,比如'C(2,2)%>%的过滤器(。数据= d,等等...' –

+1

你怎么样试试这个,而不是 'd%>%过滤器(%在%C(2,2))' – Kay

+0

我知道,'d%>%过滤器)(单位:%C(2,2%)'的作品。但我展示一个玩具例子,在现实中我的C(2 ,2)更复杂,并且它是其他一些东西的输出。这就是我想要管的东西。 – Bruno

回答

2

管道被设计为当你传递它时围绕它的第一个参数组成函数。当你想规避这种行为时,你可以生成一个更加灵活的匿名环境。你用花括号来做这件事,就像你在写一个函数一样。

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

为什么这个作品,写{somefunctions(x, y)}相当于写function(...) {somefunctions(x, y)}。所以上面的函数忽略了它的参数,只是在它的环境中评估变量。 .代名词是由管道定义的,它在全球环境中搜索其他变量(如iris)。

+1

太棒了,所以在我的情况下,它会是'c(2,2)%>%{filter(d,a%in%。)}',这很有效! ' – Bruno

0

它默认管道的第一个参数。围绕它的唯一方法是命名明确的第一个参数:

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 

附:你不需要明确地加载magrittr,因为%>%已经在dplyr

+0

很奇怪我认为整点点是能够管到我想要的任何参数 – Bruno

+0

管道的主要规则是它总是映射到第一个参数,除非您明确指定第一个参数rg到别的东西。 – Zafar