对于返回data.frame
或list
的函数,我可以使用以下语法对单个列进行子集化:
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
我想知道为什么$
在管道中使用时不起作用,如上例所示。
答案 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)
。