Оценка слишком глубоко вложена при использовании ссылочного класса с активной привязкой

Воспроизводимый пример:

bed2_RC <- methods::setRefClass(

  "bed2",

  fields = list(
    .fam = "data.frame",

    #### Active bindings
    fam = function() {
      if (ncol(.self$.fam) == 0) {
        .self$.fam <- datasets::iris
      }
      .self$.fam
    },

    nrow = function() print(nrow(.self$fam))
  )
)

bed2 <- function() new(Class = "bed2")
bed2()

Сообщение об ошибке:

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

Я не понимаю, почему здесь происходит бесконечный цикл.


person F. Privé    schedule 30.09.2019    source источник


Ответы (1)


Хм, при использовании nrow(.self$fam) он фактически пытается вызвать активную привязку $nrow(), а не базовую функцию. Замена на base::nrow(.self$fam) работает как положено.

person F. Privé    schedule 30.09.2019
comment
@Oliver Оливер, я не могу подтвердить свой ответ раньше, чем через два дня. - person F. Privé; 30.09.2019