15

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

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)))  

在这两种情况下,我的解决方案似乎都很笨拙,以至于我觉得我错过了更好的方法来做到这一点。我应该如何将多个参数传递给函数?

4

3 回答 3

11

在 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  

或者

list(x = rnorm(100), y = runif(100)) %>% { cor(.$x, .$y) } 

{对动态创建了一个 lambda(一元函数),因此您不必做整个(function(x) { ... })事情。

附带说明一下,theinsetinset2别名可用于“拾取”管道中的值,例如列表。

于 2014-11-24T09:57:33.350 回答
8

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

管道R:

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

[1] 0.05564807

玛格丽特:

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

[1] 0.05564807

该软件包的作者提供了一个出色的 pipeR 教程。在这种情况下没有太大区别:-)

于 2014-09-21T15:25:59.863 回答
2

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

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

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

rnorm(100) %>% cor(y = runif(100))
于 2014-09-21T11:29:17.033 回答