2015-02-08 17 views
0

我有一个关于该代码示例一个问题工作:与subsettable功能和Optim()

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

当我尝试优化该功能,的Optim例如要我提供两个单独的功能,一个功能评价和一个梯度评估。因此,

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) 

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

回答

0

假设你的问题只是如何存储对象中的两个功能,那么一个可能的解决方案是

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

那么你可以做

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

这绝对是一种解决方案,I'寻找。在你的建议后,我注意到我的例子缺乏一个重要的特征:渐变取决于功能评估。 X^2可能不是这里最好的例子。 – Daniel 2015-02-08 23:01:20

+0

那么为什么你不能在这个解决方案中使用'g.grad = function(x)2 * somefunction(x)'?我没有看到问题。由于'somefunction'没有被定义,所以你可重复的例子不再是可重复的。 – MrFlick 2015-02-08 23:08:59