如何使用"dplyr"链运算符%>%将左侧本身放在R中?

xir*_*uru 14 r dplyr

包"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)
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*lph 16

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

x = c(5,7,8,1)
x %>% sum(.[1 : 3])
Run Code Online (Sandbox Code Playgroud)

是相同的:

sum(x, x[1 : 3])
Run Code Online (Sandbox Code Playgroud)

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

x %>% {sum(.[1 : 3])}
Run Code Online (Sandbox Code Playgroud)

但是,在这一点上,最好将管道分开一点(就像你自己做的那样):

x %>% `[`(1 : 3) %>% sum()
Run Code Online (Sandbox Code Playgroud)

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

x %>% extract(1 : 3) %>% sum()
Run Code Online (Sandbox Code Playgroud)


Ten*_*bai 5

让我们引用文档:

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

那会发生什么?

当你调用sum时,它被调用如下:

n <- c(5,7,8,1) 
sum(n,n[1:3])
Run Code Online (Sandbox Code Playgroud)

lhs %>%作为第一个arg传递给sum,子集作为第二个arg传递.在第三个表单上,只有选择器的输出作为参数传递给sum