【问题标题】:How to add functions in R如何在 R 中添加函数
【发布时间】:2014-08-04 17:57:17
【问题描述】:

我正在尝试对列表中的函数求和以创建一个新函数。这对于少数功能来说很容易。这是一个例子:

f <- function(x){x}
g <- function(x){x+1}

现在我们将fg 相加。

fg <- function(x){f(x) + g(x)}

但是如果我有 100 个函数要求和,那么这个方法就会变得笨拙。有没有办法从列表中自动创建类似fg 的函数?

【问题讨论】:

  • MrFlick 的回答很好,但是您首先应该问自己为什么/如何最终得到一个溢出堆栈(对不起 :-))的独立小函数。我无法想象 100 个不相关函数的总和有多大意义。也许您可以编写一些递归函数,将所有这些函数合二为一?
  • @Carl 你的直觉是正确的——它们不是不相关的函数。我不确定我是否理解您关于递归的建议。不要为 x+0*a, x+1*a,... 之类的东西定义单独的函数并将它们相加,而是建议我找到函数 x+0*a + x+1*a +... 立即使用某种递归?如果是这样,你知道怎么做吗?
  • 你只有向量值的系数?看起来你可以用简单的矩阵代数来做到这一点。
  • @MrFlick 不,我实际上在错误函数中有复杂的表达式......

标签: r functional-programming add


【解决方案1】:

我更喜欢Reduce

f <- function(x){x}
g <- function(x){x+1}
h <- function(x){x*2}

funs<-list(f,g,h)

x <- 1:3

Reduce("+", lapply(funs, function(f, y) f(y), y=x))
#[1]  5  9 13

当然,所有函数的返回值必须具有相同的长度。

【讨论】:

    【解决方案2】:

    您可以使用sapply 循环遍历函数然后应用

    f <- function(x){x}
    g <- function(x){x+1}
    h <- function(x){x*2}
    
    funs<-list(f,g,h)
    
    x <- 2
    rowSums(matrix(sapply(funs, function(f, z) f(z), z=x), nrow=length(x)))
    # [1] 9
    

    我使用 matrixrowSums 函数以防万一您希望能够在 x 也是值向量时调用它

    x <- 1:3
    rowSums(matrix(sapply(funs, function(f, z) f(z), z=x), nrow=length(x)))
    # [1]  5  9 13
    

    你可以通过创建一个辅助函数来让它更干净

    getfunsum <- function(funs) {
        force(funs)
        function(x) {
            rowSums(matrix(sapply(funs, function(f, z) f(z), z=x), nrow=length(x)))
        }
    }
    fgh <- getfunsum(funs)
    fgh(1:3)
    # [1]  5  9 13
    

    【讨论】:

      【解决方案3】:

      你可以试试:

       fun1 <- function(i,a) {
                      eval(substitute(function(x, a) {x+i*a}, list(i=i)))}
      
      n <- 0:3
      lst <- lapply(n, fun1)
      rowSums(sapply(lst, function(f) f(12:14, 3)))
      #[1] 66 70 74
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多