我试图将列表中的函数相加以创建新函数。这对于少量功能来说很容易。这是一个例子:
f <- function(x){x}
g <- function(x){x+1}
现在我们总结f
和g
。
fg <- function(x){f(x) + g(x)}
但是如果我有100个我想要求和的函数,这个方法就会变得笨拙。有没有办法从列表中自动创建像fg
这样的函数?
答案 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
我使用matrix
和rowSums
函数,以防您希望在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