在闭包中使用magrittr管道

时间:2018-02-13 14:26:48

标签: r dplyr pipe magrittr

1让我们看一下这个例子:

1:3 %>% rep(.,2) + 1 %>% sum  #[1] 2 3 4 2 3 4

[2] R正在做的是:

1:3 %>% rep(.,2) + (1 %>% sum)

[3]我想要R做的是:(这给出了错误),我喜欢在那里得到18

1:3 %>% (rep(.,2) + 1) %>% sum  #Error in rep(., 2) : attempt to replicate an object of type 'closure'

[4]所以我需要超级跛脚:

tmp <- 1:3 %>% rep(.,2) + 1
tmp %>% sum #[1] 18

如何解决[3]工作。有人可以解释我的错误信息吗?

修改

来自here

  

请注意,%&gt;%左侧的变量x将应用为   右侧函数中的第一个参数。这个默认值   行为可以改变使用。这被称为占位符。

     

然而,要记住的一件重要事情是,当。出现在   嵌套表达式仍然应用第一个参数规则。但是这个   可以使用花括号{}

来抑制行为

有趣的是,我不知道的是:

这是平等的:

1:3 %>% sum(rep(.,3))   #[1] 24
1:3 %>% sum(.,rep(.,3)) #[1] 24

这两者是平等的:

1:3 %>% {sum(rep(.,3))}  #[1] 18
1:3 %>% rep(.,3) %>% sum #[1] 18 

EDIT2

> packageVersion("magrittr")
[1] ‘1.5’

此:

?'%>%'

给出:(我不知道我的%&gt;%运算符背后是什么包,我不太喜欢那么说实话)

  

在以下软件包中找到了有关'%&gt;%'主题的帮助:

     

管道操作员(在库C:/ Program中的包tidyr中)   文件/ R / R-3.3.2 /库)magrittr正向管道操作员(包装中   库C中的magrittr:/ Program Files / R / R-3.3.2 / library)管道运算符   (在库C的包stringr中:/ Program Files / R / R-3.3.2 / library)   从其他包导出的对象(在库中的包dplyr中)   C:/ Program Files / R / R-3.3.2 / library)

1 个答案:

答案 0 :(得分:2)

二元运算符+正在创建问题。它的优先级低于管道(参见?Syntax)。在汇总到sum之前将整个操作括在括号中,或者使用+的函数形式:

(1:3 %>% rep(.,2) + 1) %>% sum
[1] 18

1:3 %>% rep(.,2) %>% `+`(1) %>% sum
[1] 18