r - R 中的更高级别函数 - 是否有官方的 compose 运算符或 curry 函数?

标签 r functional-programming higher-order-functions

我可以在 R 中创建一个组合运算符:

 `%c%` = function(x,y)function(...)x(y(...)) 

像这样使用:

 > numericNull = is.null %c% numeric
 > numericNull(myVec)
 [2] TRUE FALSE

但我想知道是否有一组官方函数可以执行此类操作以及其他操作,例如 R 中的柯里化(Currying)。很大程度上,这是为了减少我的代码中括号、函数关键字等的数量。

我的 curry 函数:

> curry=function(...){
    z1=z0=substitute(...);z1[1]=call("list");
    function(...){do.call(as.character(z0[[1]]),
                          as.list(c(eval(z1),list(...))))}}
> p = curry(paste(collapse=""))
> p(letters[1:10])
[1] "abcdefghij"

这对于例如聚合:

> df = data.frame(l=sample(1:3,10,rep=TRUE), t=letters[1:10])
> aggregate(df$t,df["l"],curry(paste(collapse="")) %c% toupper)
  l    x
1 1  ADG
2 2  BCH
3 3 EFIJ

我发现它比以下内容更优雅和可编辑:

> aggregate(df$t, df["l"], function(x)paste(collapse="",toupper(x)))
  l    x
1 1  ADG
2 2  BCH
3 3 EFIJ

基本上我想知道 - R 已经这样做了吗?

最佳答案

这两个函数实际上都存在于 the roxygen package 中( see the source code here ) 来自 Peter Danenberg(最初基于 Byron Ellis's solution on R-Help ):

Curry <- function(FUN,...) {
  .orig = list(...);
  function(...) do.call(FUN,c(.orig,list(...)))
}

Compose <- function(...) {
  fs <- list(...)
  function(...) Reduce(function(x, f) f(x),
                       fs,
                       ...)
}

请注意 Reduce 函数的用法,这在尝试在 R 中进行函数式编程时非常有帮助。有关更多详细信息,请参阅 ?Reduce(其中还涵盖了其他函数,例如 Map 过滤器)。

还有你的 Curry 示例(用法略有不同):

> library(roxygen)
> p <- Curry(paste, collapse="")
> p(letters[1:10])
[1] "abcdefghij"

下面是一个展示 Compose 实用程序的示例(对字母应用三种不同的函数):

> Compose(function(x) x[length(x):1], Curry(paste, collapse=""), toupper)(letters)
[1] "ZYXWVUTSRQPONMLKJIHGFEDCBA"

你的最后一个例子将像这样工作:

> aggregate(df[,"t"], df["l"], Compose(Curry(paste, collapse=""), toupper))
  l    x
1 1  ABG
2 2 DEFH
3 3  CIJ

最后,这是一种使用 plyr 执行相同操作的方法(也可以使用 byaggregate 轻松完成,如前所述) :

> library(plyr)
> ddply(df, .(l), function(df) paste(toupper(df[,"t"]), collapse=""))
  l   V1
1 1  ABG
2 2 DEFH
3 3  CIJ

关于r - R 中的更高级别函数 - 是否有官方的 compose 运算符或 curry 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2228544/

相关文章:

r - 打开xlsx : Where is the data located in the workbook object

scala - Scala中的纯FP?

lambda - Elm 中是否有任何等价的占位符?

javascript - 为什么在reduce函数中返回局部变量的长度会抛出错误?

javascript - 如何在 Suitelet 打印输出 (Netsuite) 中对行项目使用高阶函数而不是 FOR 循环?

r - 达到阈值时 dplyr 重置计数器

r - 使用 knitr 的 spin() 时生成目录 (toc)

language-agnostic - 这个高阶函数有名字吗?

r - 在 R 中,有没有办法将向量指定为 *literal*?

java - 将函数引用作为参数传递