如何使用具有多参数功能的 magrittr 管道?

Posted

技术标签:

【中文标题】如何使用具有多参数功能的 magrittr 管道?【英文标题】:How to use magrittr piping with multi-argument functions? 【发布时间】:2014-11-15 12:10:06 【问题描述】:

对于单参数函数,将“标准”R 代码转换为magrittr 管道样式相当简单。

mean(rnorm(100))

变成

rnorm(100) %>% mean

对于多参数函数,我不清楚最好的方法是什么。有两种情况。

首先,附加参数是常量的情况。在这种情况下,您可以创建一个匿名函数来更改常量值。例如:

mean(rnorm(100), trim = 0.5)

变成

rnorm(100) %>% (function(x) mean(x, trim = 0.5))

其次,需要多个向量参数的情况。在这种情况下,您可以将输入组合到一个列表中,并创建一个对列表元素进行操作的匿名函数。

cor(rnorm(100), runif(100))

变成

list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y)))  

在这两种情况下,我的解决方案似乎都很笨拙,以至于我觉得我错过了更好的方法来做到这一点。我应该如何将多个参数传递给函数?

【问题讨论】:

【参考方案1】:

在 1.5 版中有两个选项:

list(x = rnorm(100), y = runif(100)) %$% cor(x, y) 

本质上是一样的

list(x = rnorm(100), y = runif(100)) %>% with(cor(x, y)) # you could also do this earlier  

或者

list(x = rnorm(100), y = runif(100)) %>%  cor(.$x, .$y)  

对动态创建一个 lambda(一元函数),因此您不必执行整个 (function(x) ... ) 事情。

作为旁注,insetinset2 别名可用于“拾取”管道中的值,例如列表。

【讨论】:

天哪,你不知道我一直希望 R 中的匿名函数有更短的语法...【参考方案2】:

使用 pipeR 包,cor-example 的解决方案是:

pipeR:

set.seed(123)
rnorm(100) %>>% cor(runif(100))

[1] 0.05564807

玛格丽特:

set.seed(123)
rnorm(100) %>% cor(y = runif(100))

[1] 0.05564807

软件包的作者提供了一个出色的 pipeR 教程available。在这种情况下没有太大区别:-)

【讨论】:

【参考方案3】:

第一个问题可以通过%>%的巧妙评估来解决。笨重的解决方案简化为

rnorm(100) %>% mean(trim = 0.5)

第二个问题可以用类似的方式简化,但不清楚这是否是“最佳”解决方案。

rnorm(100) %>% cor(y = runif(100))

【讨论】:

在这种情况下,我倾向于使用pipeR。这在一定程度上是每个用户更习惯的习惯用法,所以我建议大家玩一下这两个包,看看哪个对他们更有帮助。 @CarlWitthoft 有趣。那么pipeR 解决方案看起来如何? 好吧,我还不是这两种管道工具的专家,但我喜欢 pipeR 的一点是你可以使用“.”。在右侧的多个位置表示左侧的输出。

以上是关于如何使用具有多参数功能的 magrittr 管道?的主要内容,如果未能解决你的问题,请参考以下文章

R:在自编写的包中使用magrittr管道运算符

如何将管道链(magrittr)的结果提供给对象

获取在“magrittr”管道调用的函数中计算为点的表达式

%.% (dplyr) 和 %>% (magrittr) 之间的差异

magrittr 中的 %>% 和 %,% 有啥区别?

在不输入第一个参数的情况下使用管道