如何在R中添加功能

时间:2014-08-04 17:57:17

标签: r functional-programming add

我试图将列表中的函数相加以创建新函数。这对于少量功能来说很容易。这是一个例子:

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

现在我们总结fg

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

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

3 个答案:

答案 0 :(得分:4)

我更喜欢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

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

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:0)

您可以尝试:

 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