Инициализация метода в ссылочных классах R - PullRequest
11 голосов
/ 07 сентября 2011

Я заметил странное поведение в ссылочных классах R при попытке реализовать некоторый алгоритм оптимизации. Кажется, что есть некоторая закулисная магия синтаксического анализа, связанная с инициализацией методов в частности, что затрудняет работу с анонимными функциями. Вот пример, который иллюстрирует сложность: я определяю функцию для оптимизации (f_opt), функцию, которая запускает на ней optim, и эталонный класс, который имеет эти два метода. Странное поведение будет понятнее в коде

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. 

Это только я, или это похоже на ошибку для других людей?

1 Ответ

6 голосов
/ 07 сентября 2011

Этот пост в R-devel кажется актуальным, с обходным решением

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

Кажется, стоит пост в R-devel.

...