为什么我们不能使用.作为%>%的匿名函数中的参数

tho*_*hal 6 r plyr dplyr

有人可以向我解释为什么以下两条指令有不同的输出:

library(plyr)
library(dplyr)
ll <- list(a = mtcars, b = mtcars)
# using '.' as a function parameter
llply(ll, function(.) . %>% group_by(cyl) %>% summarise(min = min(mpg)))
# using 'd' as function parameter
llply(ll, function(d) d %>% group_by(cyl) %>% summarise(min = min(mpg)))
Run Code Online (Sandbox Code Playgroud)

前一种情况显然甚至没有评估(我通过拼写错误来判断summarise:不会 抛出错误).llply(ll, function(.) . %>% group_by(cyl) %>% sumamrise(min = min(mpg)))

因此,这与范围规则和评估事项有关,但我真的想了解发生了什么,以及为什么会发生这种情况?我.经常使用匿名函数作为参数,我很困惑地看到结果.

长话短说,为什么不.配合%>%

sha*_*dow 5

这似乎是由于.在使用管道时将其特别用作占位符。来自?"%>%"

将点用于辅助目的

通常,除了lhs本身的值(例如行数或列数)之外,在rhs调用中还需要lhs的某些属性或属性。在rhs调用中多次使用点占位符是完全有效的,但根据设计,在嵌套函数调用中使用点占位符时的行为会略有不同。特别是,如果占位符仅在嵌套函数调用中使用,则lhs也将作为第一个参数放置!这样做的原因是,在大多数用例中,这产生了最具可读性的代码。例如,虹膜%>%subset(1:nrow(。)%% 2 == 0 。可以通过将rhs括在括号中来推翻此行为。例如,1:10%>%{c(min(。),max(。))}等效于c(min(1:10),max(1:10))。


小智 3

.“点”)有多种用途,其中之一确实是作为参数。它的实际解释方式很大程度上取决于它的上下文 - 在您的上下文中,它紧接在前%>%向管道运算符之前使用。dplyr从 中获取其前向管道运算符magrittr,并且从magrittr文档中我们可以得到以下片段,了解当存在 时会发生什么. %>% somefunction()

当点用作左侧时,结果将是一个函数序列,即依次将整个右侧链应用到其输入的函数。

所以它几乎就像一个操作顺序 -%>%紧接在点之后会将点解释为功能序列的一部分。

让您.理解为参数的一种方法是在它周围添加括号,即

llply(ll, function(.) (.) %>% group_by(cyl) %>% summarise(min = min(mpg)))
Run Code Online (Sandbox Code Playgroud)

要更全面地解释 和 的不同用法.以及%>%它们之间的相互作用,请查看https://cran.r-project.org/web/packages/magrittr/magrittr.pdf。相关部分从第 8 页开始。