使用子表函数和optim()

时间:2015-02-08 22:30:20

标签: r

我对代码示例有一个问题:

testfunc<-function(x) {
   f<-x^2
   help.var<- somefunction(f)
   g.grad<- 2* helpvar
   return(c(f,g.grad))
}

当我尝试优化此功能时,例如,我希望我提供两个独立的功能,一个功能评估和一个梯度评估。所以,

optim(20,testfunc[1],testfunc[2])   

给出:闭包类型的对象不是子集表。

我通过定义两个函数并将g.grad定义为全局变量来解决这个问题:

testfunc1<-function(x) {
          f<-x^2
          help.var<<- somefunction(f)

           return(f)
}
help.function<-function(x){
           return(2*help.var)
}
optim(20,testfunc1,help.function)

由于原始问题涉及得更多,代码很容易混淆。你有任何想法更优雅地解决这个问题(可能根本没有使用全局变量)?

1 个答案:

答案 0 :(得分:0)

假设您的问题是如何在对象中存储两个函数,那么一个可能的解决方案是

testfunc <- list(
   f = function(x) x^2,
   g.grad = function(x) 2*x
)

然后你可以做

optim(20,testfunc[[1]],testfunc[[2]])