如何使用magrittr管道符处理多个参数函数?

16

对于单参数函数,将“标准”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)))  

在这两种情况下,我的解决方案似乎都不够优雅,我觉得可能有更好的方法来处理这个问题。如何将多个参数传递到函数中?

3个回答

11

在版本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中有一个更短的匿名函数语法。 - Patrick B.

8
使用 pipeR 包,cor-example 的解决方案如下: pipeR:
set.seed(123)
rnorm(100) %>>% cor(runif(100))

[1] 0.05564807

margrittr:

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

[1] 0.05564807

这里有一份优秀的pipeR教程可供使用,由该包的作者提供。在这种情况下,并没有太大的区别 :-)


2
第一个问题可以通过%>%的巧妙评估来解决。笨重的解决方案简化为:
rnorm(100) %>% mean(trim = 0.5)

第二个问题可以用类似的方式简化,但不清楚这是否是“最佳”解决方案。
rnorm(100) %>% cor(y = runif(100))

1
我倾向于在这种情况下使用 pipeR。这部分取决于每个用户更喜欢哪种习惯用法,因此我建议大家尝试使用这两个软件包一段时间,看看哪个对他们更有帮助。 - Carl Witthoft
1
@CarlWitthoft 很有趣。那么 pipeR 的解决方案是什么样子的? - Richie Cotton
1
嗯,我对管道工具也不是专家,但我喜欢 pipeR 的一点是你可以在右侧的多个位置使用"."来表示左侧的输出。 - Carl Witthoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接