2015-01-23 21 views
9

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.

+0

Ustawieniem domyślnym dla R6Class jest "class = TRUE", więc w pewnym sensie wszystkie przykłady, które widzisz, są ilustracjami takiego użycia. –

+0

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. –

+0

Oficjalna odpowiedź (przynajmniej od teraz) jest to, że to, co robię, jest poprawne. https://github.com/wch/R6/issues/42 –

Odpowiedz

4

Poprosiłem Winston Chang, autora R6, o tym on Github. Według niego kod podany w pytaniu 1 powyżej jest poprawnym sposobem pisania metod S3 dla klas R6.