如何使用具有多参数函数的magrittr管道?
对于单参数函数,将“标准”R代码翻译为magrittr
管道样式是相当简单的。如何使用具有多参数函数的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)))
在这两种情况下,我的解决方案似乎不多,所以我觉得我缺少一个更好的方式来做到这一点笨重。我应该如何将多个参数传递给函数?
使用PIPER封装为COR-例的解决办法是:
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
有一个极好的PIPER教程available来自包的授权者。没有太多:-)
第一个问题可以通过%>%
的巧妙评估来解决。笨重的解决方案简化为:
rnorm(100) %>% mean(trim = 0.5)
第二个问题可以通过类似的方式简化,但不清楚这是否是“最佳”解决方案。
rnorm(100) %>% cor(y = runif(100))
以V 1.5在这种情况下的差异有两种选择:
list(x = rnorm(100), y = runif(100)) %$% cor(x, y)
这是essemtially一样
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
别名可以被用来“拾取”流水线中的值,例如,名单。
哦,我的天啊,你不知道我一直希望在R中有多少匿名函数的语法... – 2017-04-21 03:35:11
我倾向于在这种情况下使用'pipeR'。这部分是每个用户更习惯的习惯用语,所以我建议大家一起玩这两个包,看看哪些可以帮助他们更多。 – 2014-09-21 13:16:16
@CarlWitthoft有趣。那么'pipeR'解决方案的外观如何? – 2014-09-21 13:24:57
那么,我并不擅长管道工具,但我喜欢'pipeR'的是你可以使用“。”。在右侧的多个位置表示左侧的输出。 – 2014-09-21 16:47:29