如何使用具有多参数功能的 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) ... )
事情。
作为旁注,inset
和 inset2
别名可用于“拾取”管道中的值,例如列表。
【讨论】:
天哪,你不知道我一直希望 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 管道?的主要内容,如果未能解决你的问题,请参考以下文章