gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:41:23 27 4
gpt4 key购买 nike

我可以在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com