2011-09-07 9 views
11

いくつかの最適化アルゴリズムを実装しようとすると、R参照クラスでいくつかの奇妙な振る舞いに気付きました。匿名の関数で作業することを難しくする、特定のメソッドの初期化に関わる舞台裏での解析の魔法があるようです。 難易度を示す例は次のとおりです。最適化する関数(f_opt)と、最適化を実行する関数と、これらの2つをメソッドとして持つ参照クラスを定義します。奇妙な振る舞いは、コードR参照クラスのメソッド初期化

f_opt <- function(x) (t(x)%*%x) 

do_optim_opt <- function(x) optim(x,f) 
do_optim2_opt <- function(x) 
    { 
    f(x) #Pointless extra evaluation 
    optim(x,f) 
    } 

optClass <- setRefClass("optClass",methods=list(do_optim=do_optim_opt, 
           do_optim2=do_optim2_opt, 
           f=f_opt)) 
oc <- optClass$new() 
oc$do_optim(rep(0,2)) #Doesn't work: Error in function (par) : object 'f' not found 
oc$do_optim2(rep(0,2)) #Works. 
oc$do_optim(rep(0,2)) #Parsing magic has presumably happened, and now this works too. 

に明確になり、それは私だけですか、これはあまりにも他の人へのバグのように見えますか? R-develの中

+1

あなたは助力(「力」)を見ましたか? –

+0

私はAllan E.に同意します。これは、怠け者(非)評価の古典的な例のようです。 –

答えて

6

Thisポストは、関連すると思われる、回避策

do_optim_opt <- function(x, f) optim(x, .self$f) 

とR-develのに価値がポストようです。

+0

それはそれを修正しました。どうもありがとう! – sbarthelme

関連する問題