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:
- 默认情况下,左侧 (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 和向量(函数接收两个参数)。我相信这是因为您没有将 .
移动到第一个参数以外的位置,因此您没有更改行为以将对象作为第一个参数传递。
碰巧 magrittr
包有一个不同的运算符用于这种情况。您可以使用 %$%
.
library(magrittr)
dat %$% all(b)
# [1] TRUE
我想不通。
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:
- 默认情况下,左侧 (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 和向量(函数接收两个参数)。我相信这是因为您没有将 .
移动到第一个参数以外的位置,因此您没有更改行为以将对象作为第一个参数传递。
碰巧 magrittr
包有一个不同的运算符用于这种情况。您可以使用 %$%
.
library(magrittr)
dat %$% all(b)
# [1] TRUE