我有一个函数列表,我想将它们添加到一个“大”函数中。例子:
funlist=list()
funlist[[1]]=exp(x1)
funlist[[2]]=sin(x2)
期望的结果:
bigfun = exp(x1) + sin(x2)
我知道对于数字情况可以使用
reduce("+", list)
,但是上面的非数字情况呢?请注意:我正在寻找一种通用的自动化解决方案,即功能列表可能会有所不同(功能本身和列表长度/功能数量),但列表中的所有功能必须最终添加到一个最后的术语中.每个函数都应该有自己必须提供的值(例如 x1 到 funlist[[1]],x2 到 funlist[[2]] 等)。
重要提示:然后将 bigfun 项传递给优化器 (optim) 以找到每个函数的最佳值,从而最大化所有函数的结果。
编辑:
为简单起见,我选择了函数 exp(x1) 和 sin(x2)。函数本身就是函数包装器,例如
function(x) {y1*x + y2*x^2 + y3*x^3} ,其中 y1, y2, y3 之前已经计算过。
最佳答案
这是一种将函数存储在列表中的函数式编程方法。
funs <- c(sin,exp)
bigfun<-function(x,funs){
sum(sapply(funs, function(f) f(x)))}
bigfun(x=10,funs=funs)
从哈德利·威克姆 (Hadley Wickham) 那里了解到:
http://adv-r.had.co.nz/Functional-programming.html#lists-of-functions
**编辑**提供多个值(即每个函数的不同值):
bigfun2<-function(vec,funs){vf<-function(vec,funs){funs(vec)}
sum(sapply(1:length(vec),function (i) vf(vec[i],funs[[i]])))}
optim(par=initvec,fn=bigfun2,funs=funs)
这假设您有一个等于数据向量长度的函数列表,其中
funs
是您的函数列表和 vec
是你的数据向量。在优化示例中,只需设置一个向量 initvec
初始起始值的长度等于 funs
,它作为附加参数传递给 optim
关于r - 在 R : turn list of functions into one big function (element-wise sum of functions),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23308581/