我不知道这一点。

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
    

    关于r - dplyr和所有的可能性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34055700/

    10-14 03:03