R与点("."),"〜"和管道(%>%)运算符的组合

Chr*_*ris 4 r pipe dplyr magrittr

我一直在寻找很多答案,但我仍然无法完全理解它们.例如,最明显的一个(在这里),其中包括(1,2,3)给出了具体的实例对点的各种用途,但我不能在这里理解,例如,它的应用:

car_data <- 
  mtcars %>%
  subset(hp > 100) %>%
  aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2)) %>%
  transform(kpl = mpg %>% multiply_by(0.4251)) %>%
  print

#result:
  cyl   mpg  disp    hp drat   wt  qsec   vs   am gear carb    kpl
1   4 25.90 108.0 111.0 3.94 2.15 17.75 1.00 1.00 4.50 2.00 11.010
2   6 19.74 183.3 122.3 3.59 3.12 17.98 0.57 0.43 3.86 3.43  8.391
3   8 15.10 353.1 209.2 3.23 4.00 16.77 0.00 0.14 3.29 3.50  6.419
Run Code Online (Sandbox Code Playgroud)

上面的代码来自magrittr中对%>%的解释,其中我也试图理解管道运算符(我知道它给你以前计算的结果,但是aggregate当它混合时我在代码行中迷路了).,并%>%在同一个功能内.

所以,我无法理解上面的代码是什么.我有结果(我把它放在上面).但我不知道它是如何达到那个结果的,特别是aggregate代码行,它使用点和~符号.我知道这~意味着"所有其他变量",但它对点的意义是什么?它有另一种含义或应用吗?管道操作员在特定功能中的作用是什么?

MrF*_*ick 8

该行使用.三种不同的方式.

         [1]             [2]      [3]
aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2))
Run Code Online (Sandbox Code Playgroud)

一般来说,您将管道中的值传递到特定位置的函数,.但有一些例外.一个例外是.在公式中.该~用于创建在R.式中的管不会改变式的意义,所以它的行为就像它会不发生任何转义.例如

aggregate(. ~ cyl, data=mydata)
Run Code Online (Sandbox Code Playgroud)

这只是因为aggregate需要左右两侧的公式.因此,.[1]仅仅意味着"数据集中的所有其他列." 这种用法与magrittr完全无关.

.[2]是真实传递中作为管的值.如果你有一个plain .作为函数的参数,那就是那里的值.因此,结果subset()将转到data=参数.

magrittr库还允许您使用.变量定义匿名函数.如果你有一个以a开头的链.,它被视为一个函数.所以

. %>% mean %>% round(2)
Run Code Online (Sandbox Code Playgroud)

是相同的

function(x) round(mean(x), 2)
Run Code Online (Sandbox Code Playgroud)

所以你只是用.at 创建一个自定义函数[3]