【问题标题】:Why can't we use . as a parameter in an anonymous function with %>%为什么我们不能使用 .作为带有 %>% 的匿名函数中的参数
【发布时间】:2017-03-06 04:09:32
【问题描述】:

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

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)))

前一种情况显然甚至没有被评估(我认为拼写错误summarisellply(ll, function(.) . %&gt;% group_by(cyl) %&gt;% sumamrise(min = min(mpg)))不会抛出错误)。

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

长话短说,为什么. 不能与%&gt;% 一起使用?

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    这似乎是因为在使用管道时特别使用了. 作为占位符。来自?"%&gt;%"

    将点用于次要目的

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

    【讨论】:

    • 谢谢,基本上是 RTFM - 本来可以自己弄清楚,但我对这种行为感到非常困惑,我认为这是一个非常特殊的情况 ;)
    【解决方案2】:

    .(“点”)有多种用途,其中一种确实是作为参数。它的实际解释方式高度依赖于它的上下文——在你的上下文中,它在%&gt;% forward-pipe 运算符之前立即使用。 dplyrmagrittr 中获取其正向管道运算符,并且从 magrittr 文档中,我们有以下关于当有 . %&gt;% somefunction() 时会发生什么的 sn-p:

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

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

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

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

    有关.%&gt;% 的不同用法以及它们之间的交互的更详尽说明,请查看https://cran.r-project.org/web/packages/magrittr/magrittr.pdf。相关部分从第 8 页开始。

    【讨论】:

    • 感谢您指出正确的文档,现在已经很清楚了,我认为这个答案更能解释原因
    猜你喜欢
    • 2021-02-11
    • 2017-12-04
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多