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

如何使用带多参数函数的magrittr管道?,r,magrittr,R,Magrittr,对于单参数函数,将“标准”R代码转换为管道样式相当简单 mean(rnorm(100)) 变成 rnorm(100) %>% mean rnorm(100) %>% (function(x) mean(x, trim = 0.5)) list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y))) 对于多参数函数,我不清楚最好的方法是什么。有两种情况 首先,当附加参数是常量时的情况。在

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

mean(rnorm(100))
变成

rnorm(100) %>% mean
rnorm(100) %>% (function(x) mean(x, trim = 0.5))
list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y)))  
对于多参数函数,我不清楚最好的方法是什么。有两种情况

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

mean(rnorm(100), trim = 0.5)
变成

rnorm(100) %>% mean
rnorm(100) %>% (function(x) mean(x, trim = 0.5))
list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y)))  
第二,需要多个向量参数的情况。在这种情况下,您可以将输入合并到列表中,并创建一个对列表元素进行操作的匿名函数

cor(rnorm(100), runif(100))
变成

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

在这两种情况下,我的解决方案似乎都很笨拙,以至于我觉得我错过了一个更好的方法。如何将多个参数导入函数?

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

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

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

使用pipeR软件包,cor示例的解决方案为:

风笛手:

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

[1] 0.05564807
玛格丽特:

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

[1] 0.05564807

有一个优秀的派珀教程从自动的软件包。在这种情况下没有太大区别:-)

在v中。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  

{
对动态创建一个lambda(一元函数),因此您不必执行整个
(函数(x){…})
操作


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

在这种情况下,我倾向于使用
pipeR
。这部分是每个用户都比较熟悉的习惯用法,因此我建议大家在使用这两个软件包时多玩一会儿,看看哪一个对他们更有帮助。@CarlWitthoft很有趣。
pipeR
解决方案看起来怎么样?嗯,我不擅长这两种管道工具都还没有,但我喜欢的是,
pipeR
可以在右手边的多个位置使用“.”来表示左手边的输出。哦,天哪,你不知道我希望R中匿名函数的语法更短有多久了。。。