2011-09-07 3 views
11

J'ai remarqué un comportement étrange dans les classes de référence R lors de la tentative d'implémentation d'un algorithme d'optimisation. Il semble y avoir quelques magies d'analyse en coulisses impliquées dans l'initialisation des méthodes dans un particulier, ce qui rend difficile de travailler avec des fonctions anonymes. Voici un exemple qui illustre la difficulté: Je définis une fonction à optimiser (f_opt), une fonction qui exécute optim, et une classe de référence qui a ces deux méthodes. Le comportement étrange sera plus clair dans le codeInitialisation de méthodes dans les classes de référence 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. 

Est-ce juste moi, ou est-ce que ça ressemble un bug à d'autres personnes aussi?

+1

Avez-vous regardé l'aide ("force")? –

+0

Je suis d'accord avec Allan E. Cela ressemble à un exemple classique de paresseux (non) évaluation. –

Répondre

6

This poste en R-devel semble pertinent, avec solution de contournement

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

semble valoir la peine d'un poste à R-devel.

+0

Cela l'a corrigé. Merci beaucoup! – sbarthelme

Questions connexes