Правильный способ реализации диспетчеризации S3 на классах R6

У меня есть R6 класс, и я хочу добавить S3 метод для этого. В документации, которую я нашел, упоминается кратко, что для использования S3 отправить на R6 Вы должны иметь class = TRUE, но я не смог найти пример того, как это должно быть сделано.

Я видел эмпирически, что просто написание метода S3 в форме s3generic.r6class работал, но я хотел знать, действительно ли это правильный способ написать S3 метод для R6,

Например, скажем, у меня есть R6 класс, который усиливает list

library(R6)

R6list <- R6Class(
  "R6list",
  public = list(
    orig = NULL,
    initialize = function(x) {
      self$orig <- x
    }
  )
)

Вопрос 1

Естественно, я хочу предоставить метод для получения базового списка, поэтому я хотел добавить as.list метод. Является ли стандартным добавление как общего S3, так и as.list общественная функция внутри класса? Мой интуитивный ответ состоит в том, чтобы добавить оба.

R6list <- R6Class(
  "R6list",
  public = list(
    orig = NULL,
    initialize = function(x) {
      self$orig <- x
    },
    as.list = function() {
      self$orig
    }
  )
)

as.list.R6list <- function(x, ...) {
  x$as.list()
}

Так что теперь, если у меня есть объект mylist <- R6list$new(as.list(letters[1:5])) Я могу либо позвонить as.list(mylist) или же mylist$as.list(), Один из них предпочтительнее другого?

вопрос 2
Есть ли что-то особенное в написании S3 метод для R6 классы, или то, что я написал выше, достаточно и правильно? Я не был уверен, что S3 Метод должен быть написан вне определения класса, или если R6 как-то дает способ написать S3 методы внутри него, так что весь код, относящийся к классу, локализован.

1 ответ

Решение

Я спросил Уинстона Чанга, автора R6об этом на Github. По его словам, код, приведенный в вопросе 1 выше, является правильным способом написания методов S3 для классов R6.

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