对于单个参数函数,将"标准"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)
在这两种情况下,我的解决方案看起来很笨重,我觉得我错过了更好的方法来做到这一点.我应该如何将多个参数传递给函数?
使用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中获得.在这种情况下没有太大区别:-)
在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) { ... })
事情.
作为旁注,可以使用inset
和inset2
别名来"拾取"管道中的值,例如列表.