2011-09-07 18 views
11

He notado un comportamiento extraño en las clases de referencia R cuando intento implementar algún algoritmo de optimización. Parece que hay una magia de análisis detrás de escena involucrada en la inicialización de métodos en un particular que hace que sea difícil trabajar con funciones anónimas. Aquí hay un ejemplo que ilustra la dificultad: defino una función para optimizar (f_opt), una función que se ejecuta de manera óptima y una clase de referencia que tiene estos dos métodos. El extraño comportamiento será más clara en el códigoInicialización del método en las clases de referencia 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. 

¿Soy yo, o se ve esto como un insecto a otras personas también?

+1

¿Has visto la ayuda ("fuerza")? –

+0

Estoy de acuerdo con Allan E. Esto parece un ejemplo clásico de evaluación (no) perezosa. –

Respuesta

6

This puesto en I-devel parece relevante, la solución

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

Parece digno de un puesto a R-devel.

+0

Eso lo solucionó. ¡Muchas gracias! – sbarthelme

Cuestiones relacionadas