dplyr 和所有的奇怪之处

Oddity with dplyr and all

我想不通。

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 包中借用的,它定义了 following rules:

  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