У меня есть класс R6
, и я хочу добавить для него метод S3
. В приведенной документации я кратко упомянул, что для использования отправки S3
на R6
у вас должно быть class = TRUE
, но я не смог найти пример того, как это сделать.Правильный способ реализации отправки S3 по классам R6
я видел эмпирически, что просто писать метод 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
методов внутри него, чтобы весь код, относящийся к классу, был локализован.
По умолчанию для R6Class является 'class = TRUE', поэтому в некотором смысле все примеры, которые вы видите, являются иллюстрациями такого использования. –
Правильно, 'class = TRUE' является причиной моего кода выше, но я не видел примеров, явно показывающих, как писать метод S3, поэтому мне интересно, является ли это рекомендуемым способом для этого –
Официальный ответ (по крайней мере, сейчас) заключается в том, что то, что я делаю, является правильным. https://github.com/wch/R6/issues/42 –