【问题标题】:Function Composition in R (and high level functions)R中的函数组合(和高级函数)
【发布时间】:2011-02-07 07:08:01
【问题描述】:

R 中有没有类似函数组合的东西?

我认为在 haskell 中它类似于 "(.)" 而在 agda 中它是环运算符。

另外,我在 R 中找到了有关高级函数式编程的少量信息。 我发现函数“Reduce”、“Map”、“Filter”……还有更多吗?有什么指点吗?

【问题讨论】:

标签: r haskell


【解决方案1】:

functional 包有一个 Compose 函数,它可以泛化到任意数量的函数:

set.seed(123)
x <- matrix(runif(100), 10, 10)
mean(rowSums(scale(x)))
# [1] 5.486063e-18

library(functional)
Compose(scale, rowSums, mean)(x)
# [1] 5.486063e-18

(注意函数是从左到右应用的。)

【讨论】:

    【解决方案2】:

    你可以做这样的合成功能:

    composite<-function(f,g) function(...) f(g(...))
    
    f<-function(x) x+1;
    g<-function(x) x*2;
    composite(f,g)(7)
    composite(g,f)(7)
    

    或者做这个的操作符。

    关于第二点,有很多这样的;我认为最常用的是 *apply 系列(sapply、mapply、tapply、lapply、apply...)。

    【讨论】:

    • 嗨。谢谢你的回答。另一个困扰我的问题是:我如何使用“f”作为“function”的快捷方式?就像函数定义的“g
    • @mrsteve:不是(有很多黑客行为)。无论如何,这对我来说似乎是一个非常糟糕的主意。
    • @mrsteve 不幸的是不是——这是 R 中唯一的关键字和 ***,8 个字母。另一方面,lambda 会排斥“正常人”,而 f 会令人困惑......
    • 我想很多人在做统计的时候会想把他们的变量称为 lambda。你可以试着告诉他们不要这样做,但他们不会在意。因此,这就是它不是保留字的原因
    【解决方案3】:

    purrr 库中现在有一个 compose 函数。默认情况下,合成是从右到左进行的,就像在 Haskell 中一样,但可以使用 .dir 参数反转:

    library(purrr)
    f = function(x) x+1
    g = function(x) x*3
    
    > compose(g,f)(1)
    [1] 6
    > compose(f,g, .dir="forward")(1)
    [1] 6
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2016-08-21
      • 2023-03-06
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多