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

Ric*_*ton 11 r magrittr

对于单个参数函数,将"标准"R代码转换为magrittr管道样式是相当简单的.

mean(rnorm(100))
Run Code Online (Sandbox Code Playgroud)

rnorm(100) %>% mean
Run Code Online (Sandbox Code Playgroud)

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

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

mean(rnorm(100), trim = 0.5)
Run Code Online (Sandbox Code Playgroud)

rnorm(100) %>% (function(x) mean(x, trim = 0.5))
Run Code Online (Sandbox Code Playgroud)

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

cor(rnorm(100), runif(100))
Run Code Online (Sandbox Code Playgroud)

list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y)))  
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我的解决方案看起来很笨重,我觉得我错过了更好的方法来做到这一点.我应该如何将多个参数传递给函数?

hvo*_*ier 7

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

PIPER:

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

[1] 0.05564807
Run Code Online (Sandbox Code Playgroud)

margrittr:

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

[1] 0.05564807
Run Code Online (Sandbox Code Playgroud)

有一个很好的pipeR教程可以从包的autor中获得.在这种情况下没有太大区别:-)


Ste*_*fan 7

在1.5节中,有两种选择:

list(x = rnorm(100), y = runif(100)) %$% cor(x, y) 
Run Code Online (Sandbox Code Playgroud)

这与基本相同

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

要么

list(x = rnorm(100), y = runif(100)) %>% { cor(.$x, .$y) } 
Run Code Online (Sandbox Code Playgroud)

{对在飞行中创建了一个lambda(一元函数),所以你不必完成整个(function(x) { ... })事情.

作为旁注,可以使用insetinset2别名来"拾取"管道中的值,例如列表.