2015-02-08 15 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