5

我想不通。

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)不起作用。这对我来说似乎并不直观。

4

1 回答 1

6

好吧,运算符是从定义以下规则%>%的包中借来的:magrittr

  1. 默认情况下,左侧(LHS)将作为出现在右侧(RHS)上的函数的第一个参数输入。
  2. 当在第一个位置以外的位置需要 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 和向量(该函数正在接收两个参数)。我相信这是因为您没有将 移动.到第一个参数以外的位置,因此您没有更改将对象作为第一个参数传递的行为。

碰巧magrittr包有一个不同的运算符用于这种情况。您可以使用%$%.

library(magrittr)
dat %$% all(b)
# [1] TRUE
于 2015-12-03T00:33:16.800 回答