在dplyr管道中的函数后立即使用$进行子集化时出错

时间:2017-08-06 07:39:32

标签: r dplyr

对于返回data.framelist的函数,我可以使用以下语法对单个列进行子集化:

library(dplyr)
filter(mtcars, disp > 400)$mpg
# [1] 10.4 10.4 14.7

但是这在管道(%>%)中使用时会导致以下错误:

mtcars %>% filter(disp > 400)$mpg
# Error in .$filter(disp > 400) : 
#   3 arguments passed to '$' which requires 2

我想知道为什么$在管道中使用时不起作用,如上例所示。

1 个答案:

答案 0 :(得分:2)

我想我已经找到了原因。

当我致电filter(mtcars, disp > 400)$mpg时,实际发生的是:

`$`(filter(mtcars, disp > 400), mpg)
# [1] 10.4 10.4 14.7

同样,mtcars %>% filter(disp > 400)$mpg被解释为:

`$`(mtcars, filter(disp > 400), mpg)

,因为%>%的lhs将是rhs函数的第一个参数。这再现了同样的错误,$需要2个args而3个被提供。

# Error in mtcars$filter(disp > 400) : 
#   3 arguments passed to '$' which requires 2

错误消息也验证了上述推测。 mtcars用作data.frame名称,filter(disp > 400)被视为列名: mtcars$filter(disp > 400)