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