Правильный способ реализации диспетчеризации 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.