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

时间:2016-10-24 11:38:48

标签: r dplyr plyr

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

sudo -u accumulo hdfs fsck /accumulo

前一种情况显然甚至没有评估(我通过拼写错误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))) 来判定:summarise 会抛出错误。)

所以这与范围规则和评估事项有关,但我真的想了解发生了什么,以及为什么会这样?我经常使用llply(ll, function(.) . %>% group_by(cyl) %>% sumamrise(min = min(mpg)))作为匿名函数的参数,我很困惑地看到结果。

长话短说,为什么.无法与.一起使用?

2 个答案:

答案 0 :(得分:4)

这似乎是因为.在使用管道时特殊使用占位符。来自?"%>%"

  

将点用作次要用途

     

通常,某些属性或属性   除了lhs的值之外,在rhs调用中还需要lhs   本身,例如行数或列数。它完全有效   在rhs调用中多次使用点占位符,但是按设计   在嵌套中使用它时,行为略有不同   函数调用。特别是,如果占位符仅用于a   嵌套函数调用,lhs也将作为第一个参数放置!   这样做的原因是在大多数用例中产生的最多   可读代码。例如,iris%&gt;%子集(1:nrow(。)%% 2 == 0)是   相当于虹膜%&gt;%子集(。,1:nrow(。)%% 2 == 0)但略有不同   更紧凑。通过封闭可以否决这种行为   大括号中的rhs。例如,1:10%&gt;%{c(min(。),max(。))}是   相当于c(min(1:10),max(1:10))。

答案 1 :(得分:2)

.(“点”)有多种用途,其中一种确实是作为参数。它实际解释的方式高度依赖于它的上下文 - 在您的上下文中,它在%>%正向管道运算符之前立即使用。 dplyrmagrittr获取前向管道运算符,从magrittr文档中我们得到以下代码段,了解当. %>% somefunction()时发生的情况:

  

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

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

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

llply(ll, function(.) (.) %>% group_by(cyl) %>% summarise(min = min(mpg)))

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