如何在R中实现F#的前向管道运算符?操作员可以轻松链接一系列计算。例如,当你有一个输入data
,想调用函数foo
和bar
顺序,你可以这样写:如何在R中实现F#的前向管道运算符?
data |> foo |> bar
而不是写bar(foo(data))
的。好处是您可以避免使用一些括号,并且计算的编写顺序与执行顺序相同(从左到右)。在F#中,运营商的定义如下:
let (|>) a f = f a
这样看来%...%可用于二元运算符,但如何将这项工作?
如何在R中实现F#的前向管道运算符?操作员可以轻松链接一系列计算。例如,当你有一个输入data
,想调用函数foo
和bar
顺序,你可以这样写:如何在R中实现F#的前向管道运算符?
data |> foo |> bar
而不是写bar(foo(data))
的。好处是您可以避免使用一些括号,并且计算的编写顺序与执行顺序相同(从左到右)。在F#中,运营商的定义如下:
let (|>) a f = f a
这样看来%...%可用于二元运算符,但如何将这项工作?
,我不知道它会如何容纳任何实际用途,但是这似乎(?)做你想做的事情,至少对于单参数函数......
> "%>%" <- function(x,f) do.call(f,list(x))
> pi %>% sin
[1] 1.224606e-16
> pi %>% sin %>% cos
[1] 1
> cos(sin(pi))
[1] 1
PS'do.call'可能是多余的 - 函数体可能只是'f(x)',但如果你想允许多个参数àla(list)(1,5)%>%[back -quote] x [back-quote]'你需要'do.call' ... – 2012-01-17 16:26:59
问题是,你正在谈论调用函数的完全不同的范例,所以它不是很清楚你想要什么。 [R只使用F中什么#是元组参数(在读命名),所以认为它的一个方法是平凡
fp = function(x, f) f(x)
因此,例如
> fp(4, print)
[1] 4
这相当于将要执行的呼叫,但不会在非元组的情况下工作就像4 |> f x y
因为在R.没有这样的事情你可以尝试效仿F#的功能特性,但它会很尴尬:
fp = function(x, f, ...) function(...) f(x, ...)
这会永远的功能,因此链接将努力使其例如
> tri = function(x, y, z) paste(x,y,z)
> fp("foo", fp("mar", tri))("bar")
[1] "mar foo bar"
但由于R不残缺的呼叫转换为功能是不是真的有用。相反,基于元组概念,R具有更灵活的调用。需要注意的是R使用的功能和必要的范式的混合物,所以它不执行参数值匹配等
编辑它不是单纯的功能:,因为你改变了问题,你有兴趣的语法和只特殊情况下,只是上面的中间符号替换fp
:(采用本的运营商;)
`%>%` = function(x, f) f(x)
> 1:10 %>% range %>% mean
[1] 5.5
)
编辑:现在打包在CRAN上。包括的例子。
magrittr包是为此制作的。
install.packages("magrittr")
例子:
iris %>%
subset(Sepal.Length > 5) %>%
aggregate(. ~ Species, ., mean)
而且,看到小插曲:http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html 它有不少实用的功能,如果你喜欢的F#管,谁不?
你能举个例子吗? – krlmlr 2014-03-17 22:11:02
如果您更清楚地告诉我们这个操作员实际应该做什么,这将有很大帮助,因此我们不必为自己挖掘信息。也许你的问题说明了这一点,但对我来说这有点太电报。 – 2012-01-17 15:03:06