包"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)
让我们引用文档:
将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