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

时间:2014-09-21 11:18:07

标签: r magrittr

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

答案 0 :(得分:7)

在第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别名可用于“拾取”管道中的值,例如,列表。

答案 1 :(得分:6)

使用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

来自程序包autor的一个优秀的pipeR教程available。在这种情况下没有太大区别: - )

答案 2 :(得分:2)

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

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

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

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