我怎样才能使用" dplyr"链运算符%>%左边是R?

时间:2015-10-30 10:20:28

标签: r dplyr

package" dplyr"有一个连锁经营者。但我对如何获得正确的术语本身存在疑问。

例如:

c(5,7,8,1) %>% sum(`[`(1:3)) # get result 27 (This is wrong)

c(5,7,8,1) %>% sum(.[1:3]) # get result 41 (This is also wrong)

c(5,7,8,1) %>% `[`(1:3) %>% sum()   # get result 20 (This is right)

为什么第一行和第二行代码有误?他们发生了什么事?

2 个答案:

答案 0 :(得分:16)

.是正确的。但是,%>%也会将其作为第一个参数插入:

x = c(5,7,8,1)
x %>% sum(.[1 : 3])

与:

相同
sum(x, x[1 : 3])

您可以通过将表达式包装在大括号中来显式阻止此行为:

x %>% {sum(.[1 : 3])}

然而,在这一点上,最好将管道分开一点(就像你自己一样):

x %>% `[`(1 : 3) %>% sum()

或者,使用magrittr辅助函数(需要library(magrittr)):

x %>% extract(1 : 3) %>% sum()

答案 1 :(得分:5)

让我们引用文档:

  

将lhs作为rhs调用中的第一个参数放置。的默认行为   当在rhs调用中需要多个参数时,%>%将被放置   lhs作为第一个参数,即x%>%f(y)等于f(x,y)。

那会发生什么?

当你打电话给sum时,会这样调用:

once(SomeClass)

n <- c(5,7,8,1) sum(n,n[1:3]) 的lhs作为第一个arg传递给sum,子集作为第二个arg传递。 在第三个表单上,只有选择器的输出作为参数传递给sum