为什么在 base::split(.$cyl) 中加点?

jim*_*ein 2 r tidyverse

在 R for data science第 21.5.1 章中,此语法用于基本函数split(.$cyl)。为什么点在.$cyl. 该包具有占位符( 或)purrr的语法,但未涉及..xpurrr

library(tidyverse)
mtcars %>% split(f=.$cyl) 
Run Code Online (Sandbox Code Playgroud)

pro*_*tos 5

purrr 使用的占位符语法也由 magrittr 管道 ( ) 使用%>%。默认情况下,管道将左侧 (LHS) 作为右侧 (RHS) 函数的第一个参数传递。在这种情况下,.RHS 表达式中不需要 。

例如:

mtcars %>% str()
Run Code Online (Sandbox Code Playgroud)

工作正常,相当于:

mtcars %>% str(.)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,完全.没有必要,因为 LHS( mtcars)传递给 的第一个参数str()

所以这与:

str(mtcars)
Run Code Online (Sandbox Code Playgroud)

但在任何其他情况下,您需要使用.来标记在 RHS 中 LHS 应通过的位置。

您的示例有点复杂,因为 LHS ( mtcars) 在 RHS (函数split())中传递了两次:

  • 首先,作为第一个参数(所以不需要.
  • 然后,再次作为第二个参数的一部分(所以.在这种情况下你确实需要 a )。
mtcars %>% split(f = .$cyl)
Run Code Online (Sandbox Code Playgroud)

可以写成(尽管这是不必要的):

mtcars %>% split(x = ., f = .$cyl)
Run Code Online (Sandbox Code Playgroud)

因此实际上相当于:

split(x = mtcars, f = mtcars$cyl)
Run Code Online (Sandbox Code Playgroud)