Добавить методы в подкласс R6

Я начал возиться с R6 для проекта на работе, и я не могу понять следующее поведение.

Допустим, я определил суперкласс Person и подкласс PersonWithAge:

Person <- R6Class("Person",
                  public = list(
                    name = NA,
                    hair = NA,
                    initialize = function(name, hair) {
                      if (!missing(name)) self$name <- name
                      if (!missing(hair)) self$hair <- hair
                      self$greet()
                    },
                    set_hair = function(val) {
                      self$hair <- val
                    },
                    greet = function() {
                      cat(paste0("Hello, my name is ", self$name, ".\n"))
                    }
                  )
)
PersonWithAge <- R6Class("PersonWithAge",
                       inherit = Person,
                       public = list(
                         age = NA))

Если я попытаюсь добавить новый метод в подкласс PersonWithAgeЯ получаю следующую ошибку:

> PersonWithAge$set("public", "set_age", function(age) self$age <<- age)
Error in self[[group]][[name]] <- value : 
  invalid type/length (closure/0) in vector allocation

Теперь, если я определяю новый подкласс с помощью фиктивного метода, я могу добавить новые методы к подклассу без каких-либо проблем:

PersonWithHeight <- R6Class("PersonWithHeight",
                         inherit = Person,
                         public = list(
                           height = NA,
                           foo = function() print(1)
                           ))
PersonWithHeight$set("public", "set_height", function(height) self$height <<- height)
> caitlin <- PersonWithHeight$new("Caitlin", "auburn")
Hello, my name is Caitlin.
> caitlin$set_height(165)
> caitlin
<PersonWithHeight>
  Public:
    foo: function
    greet: function
    hair: auburn
    height: 165
    initialize: function
    name: Caitlin
    set_hair: function
    set_height: function

Я пытался изменить lockпараметр в R6Class определение класса, но безрезультатно. Информация о сессии:

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252    LC_MONETARY=French_France.1252 LC_NUMERIC=C                  
[5] LC_TIME=French_France.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] R6_2.0.1

loaded via a namespace (and not attached):
[1] tools_3.1.1

Я также получаю такое же поведение на другой машине с этой информацией о сеансе:

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C            LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C         LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] R6_2.0.1

loaded via a namespace (and not attached):
[1] tools_3.1.2

Мой вопрос заключается в следующем:

  1. Я что-то упустил или это нормальное и ожидаемое поведение? В таком случае, почему так?
  2. Пока я здесь: насколько я понял, в R6 нет реальной реализации виртуальных классов и абстрактных методов?

РЕДАКТИРОВАТЬ: Хорошо, посмотрев на исходный код пакета, я понял, что в этой строке:

self[[group]][[name]] <- value

group один из public_methods, private_methods, public_fields, private_fields, Поэтому я предполагаю, что когда класс создается без каких-либо открытых методов, добавление нового открытого метода в класс завершается неудачно, потому что группа на самом деле не существует.

1 ответ

Решение

Мне удалось обойти эту проблему, вытащив исходный код из репозитория Уинстона Чанга и изменив get_functions а также get_nonfunctions функции в utils.R так что они возвращают пустой список вместо NULL когда никакие функции (соответственно, не нефункциональные) не найдены.

Другие вопросы по тегам