Mam klasę R6
i chcę dodać do niej metodę S3
. Dokumentacja, którą znalazłem wspomniała krótko, że aby użyć S3
wysyłki na R6
musisz mieć class = TRUE
, ale nie mogłem znaleźć przykładu, jak to zrobić.Właściwy sposób realizacji wysyłki S3 na klasach R6
widziałem empirycznie, że po prostu pisząc metodę S3 w formie s3generic.r6class
pracował, ale chciałem wiedzieć, czy to jest rzeczywiście dobry sposób, żeby napisać metodę S3
dla R6
.
Na przykład, że mam klasę R6
że zwiększa się list
library(R6)
R6list <- R6Class(
"R6list",
public = list(
orig = NULL,
initialize = function(x) {
self$orig <- x
}
)
)
Pytanie 1
Naturalnie chcę dostarczenie sposobu uzyskiwania listy podstawowej, więc chciałem dodaj metodę as.list
. Czy standardowe jest dodawanie ogólnej funkcji S3 I as.list
w klasie? Moja intuicyjna odpowiedź to dodanie obu.
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()
}
Więc teraz, że jeśli mam obiektu mylist <- R6list$new(as.list(letters[1:5]))
mogę albo zadzwonić as.list(mylist)
lub mylist$as.list()
. Czy jedna z tych preferowanych nad drugą?
Pytanie 2
Czy jest coś szczególnego w pisaniu metodę S3
dla R6
klasach, lub to, co napisałem powyżej wystarczający i prawidłowy sposób? Nie byłem pewien, czy metoda S3
musi zostać napisana poza definicją klasy, czy też w jakiś sposób zapewnia sposób zapisywania w niej metod S3
, aby cały kod związany z tą klasą był zlokalizowany.
Ustawieniem domyślnym dla R6Class jest "class = TRUE", więc w pewnym sensie wszystkie przykłady, które widzisz, są ilustracjami takiego użycia. –
W prawo, 'class = TRUE' jest powodem działania powyższego kodu, ale nie widziałem żadnych przykładów, które wyraźnie pokazują sposób napisania metody S3, więc zastanawiam się, czy jest to zalecany sposób wykonania tego. –
Oficjalna odpowiedź (przynajmniej od teraz) jest to, że to, co robię, jest poprawne. https://github.com/wch/R6/issues/42 –