2011-09-07 16 views
11

yönteminde başlatma yöntemi Bazı optimizasyon algoritması uygulanmaya çalışıldığında R referans sınıflarında garip davranışlar gözlemledim. Anonim işlevlerle çalışmayı zorlaştıran özel bir yöntemle başlatma işlemlerinde rol alan sihirbazların ardında yatan bazı sahneler var gibi görünüyor. İşte zorluğu gösteren bir örnek: Optimize edilecek bir işlevi (f_opt), üzerinde optim çalıştıran bir işlev ve bu ikisini yöntem olarak kullanan bir referans sınıfı tanımladım. garip davranışlar Bana mı öyle kodR referans sınıflarında

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. 

daha net olacak, ya da bu da diğer insanlara bir böcek gibi görünüyor? R-devel

+1

Yardımınıza ("kuvvet") baktınız mı? –

+0

Allan E. ile aynı fikirdeyim. Bu, tembel (non-) değerlendirmenin klasik bir örneğine benziyor. –

cevap

6

This sonrası

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

R-devel için bir post değer görünüyor geçici çözüm, ilgili görünmektedir.

+0

Bu düzeltildi. Çok teşekkürler! – sbarthelme

İlgili konular