如何在R中实现F#的前向管道运算符?

use*_*er4 16 f# r

如何在R中实现F#的前向管道运算符?操作员可以轻松地链接一系列计算.例如,当你有一个输入data,想调用函数foobar顺序,你可以这样写:

data |> foo |> bar
Run Code Online (Sandbox Code Playgroud)

而不是写作bar(foo(data)).好处是您可以避免使用某些括号,并且计算的执行顺序与执行顺序相同(从左到右).在F#中,运算符定义如下:

let (|>) a f = f a
Run Code Online (Sandbox Code Playgroud)

看起来%...%可以用于二元运算符,但是它如何工作?

Ben*_*ker 21

我不知道它对任何实际用途有多好,但这似乎(?)做你想要的,至少对于单参数函数来说......

> "%>%" <- function(x,f) do.call(f,list(x))
> pi %>% sin
[1] 1.224606e-16
> pi %>% sin %>% cos
[1] 1
> cos(sin(pi))
[1] 1
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 8

编辑:现在打包在CRAN上.示例包括.

magrittr包是为此而制作的.

install.packages("magrittr")
Run Code Online (Sandbox Code Playgroud)

例:

iris %>%
  subset(Sepal.Length > 5) %>%
  aggregate(. ~ Species, ., mean)
Run Code Online (Sandbox Code Playgroud)

另外,请看插图:http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html 如果您喜欢F#管道,它有很多有用的功能,谁不喜欢?!


Sim*_*nek 5

问题是你在谈论完全不同的调用函数的范例,所以它并不是很清楚你想要什么.R只使用F#中的元组作为元组参数(在R中命名),所以考虑它的一种方法很简单

fp = function(x, f) f(x)
Run Code Online (Sandbox Code Playgroud)

例如,它将执行调用

> fp(4, print)
[1] 4
Run Code Online (Sandbox Code Playgroud)

这是等效的,但不适用于非tupple情况,例如4 |> f x y因为在R中没有这样的东西.你可以尝试模拟F#功能行为,但它会很尴尬:

fp = function(x, f, ...) function(...) f(x, ...)
Run Code Online (Sandbox Code Playgroud)

这将始终是功能性的,因此链接将起作用

> tri = function(x, y, z) paste(x,y,z)
> fp("foo", fp("mar", tri))("bar")
[1] "mar foo bar"
Run Code Online (Sandbox Code Playgroud)

但由于R不会将不完整的调用转换为函数,因此它并不真正有用.相反,R具有基于元组概念的更灵活的调用.注意R使用功能和命令范式的混合,它不是纯函数,因此它不执行参数值匹配等.

编辑:因为您更改了问题,因为您对语法感兴趣并且只对特殊情况感兴趣,只需将fp上面替换为中缀表示法:

`%>%` = function(x, f) f(x)
> 1:10 %>% range %>% mean
[1] 5.5
Run Code Online (Sandbox Code Playgroud)

(使用Ben的运算符;))