我无法弄清楚这一点.
library(dplyr) dat <- data.frame(a = 1:5,b = rep(TRUE,5)) # this doesn't work dat %>% all(.$b) # tricky # this doesn't work dat %>% all(b) # # this does dat %>% .$b %>% all
我发现令人困惑的是all(.$b)
不起作用.这对我来说似乎并不直观.
好吧,%>%
运营商是从magrittr
包中借来的,它定义了以下规则:
默认情况下,左侧(LHS)将作为右侧(RHS)出现的函数的第一个参数进行管道输入.
当在第一个位置以外的位置需要LHS时,可以使用点"."作为占位符.
您可以看到整个数据框仍然作为此示例的第一个参数传入
f<-function(...) str(list(...)) dat %>% f(.$b) # $ :'data.frame': 5 obs. of 2 variables: # ..$ a: int [1:5] 1 2 3 4 5 # ..$ b: logi [1:5] TRUE TRUE TRUE TRUE TRUE # $ : logi [1:5] TRUE TRUE TRUE TRUE TRUE
所以你得到data.frame和vector(函数接收两个参数).我相信这是因为您没有移动.
到第一个参数以外的位置,因此您不会将行为作为第一个参数传递给对象.
事实恰恰相反,该magrittr
包具有不同的运算符,可用于此类情况.你可以用%$%
.
library(magrittr) dat %$% all(b) # [1] TRUE