2015-01-23 12 views
9

Ho una classe R6 e voglio aggiungere un metodo S3 per esso. La documentazione che ho trovato menziona brevemente che per poter utilizzare la spedizione S3 su R6 devi avere class = TRUE, ma non ho trovato un esempio di come dovrebbe essere fatto.Modo corretto per implementare la spedizione S3 su classi R6

ho visto empiricamente che semplicemente scrivendo un metodo S3 in forma s3generic.r6class lavorato, ma volevo sapere se questo è davvero a modo giusto di scrivere un metodo per S3R6.

Per esempio, dire che ho una classe R6 che esalta un list

library(R6) 

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

Domanda 1

Naturalmente, voglio fornire un metodo per ottenere la lista sottostante, così ho voluto aggiungere un metodo as.list. È standard aggiungere sia una funzione generica S3 che una funzione pubblica as.list all'interno della classe? La mia risposta intuitiva è di aggiungere entrambi.

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() 
} 

Così ora se ho un oggetto mylist <- R6list$new(as.list(letters[1:5])) posso neanche chiamare as.list(mylist) o mylist$as.list(). Uno di questi è preferito rispetto all'altro?

Domanda 2
C'è qualcosa di speciale in scrittura di un metodo per S3R6 classi, o è quello che ho scritto sopra sufficiente e il modo corretto? Non ero sicuro se il metodo debba essere scritto al di fuori della definizione della classe, o se R6 in qualche modo fornisce un modo per scrivere i metodi S3 al suo interno in modo che tutto il codice relativo alla classe sia localizzato.

+0

Il valore predefinito per R6Class è 'class = TRUE', quindi in un certo senso tutti gli esempi che vedi sono illustrazioni di tale utilizzo. –

+0

A destra, 'class = TRUE' è la ragione per cui il mio codice sopra funziona, ma non ho visto alcun esempio che mostri esplicitamente come scrivere un metodo S3 quindi mi chiedo se questo è il modo consigliato di fare questo –

+0

La risposta ufficiale (come al momento almeno) è che quello che sto facendo è corretto. https://github.com/wch/R6/issues/42 –

risposta

4

Ho chiesto a Winston Chang, l'autore di R6, di questo on Github. Secondo lui, il codice fornito nella precedente domanda 1 è il modo corretto di scrivere i metodi S3 per le classi R6.