有人可以向我解释为什么以下两条指令有不同的输出:
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)))
作为匿名函数的参数,我很困惑地看到结果。
长话短说,为什么.
无法与.
一起使用?
答案 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)
.
(“点”)有多种用途,其中一种确实是作为参数。它实际解释的方式高度依赖于它的上下文 - 在您的上下文中,它在%>%
正向管道运算符之前立即使用。 dplyr
从magrittr
获取前向管道运算符,从magrittr
文档中我们得到以下代码段,了解当. %>% somefunction()
时发生的情况:
当点用作lhs时,结果将是一个功能序列,即将整个右侧链依次应用于其输入的函数。
所以它几乎就像一个操作顺序 - 点后面的%>%
会将点解释为功能序列的一部分。
将.
理解为参数的一种方法是在其周围添加括号,即
llply(ll, function(.) (.) %>% group_by(cyl) %>% summarise(min = min(mpg)))
要更全面地了解.
和%>%
的不同用法以及它们之间的互动,请查看https://cran.r-project.org/web/packages/magrittr/magrittr.pdf。相关部分从第8页开始。