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 S3
R6
.
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 S3
R6
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.
Il valore predefinito per R6Class è 'class = TRUE', quindi in un certo senso tutti gli esempi che vedi sono illustrazioni di tale utilizzo. –
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 –
La risposta ufficiale (come al momento almeno) è che quello che sto facendo è corretto. https://github.com/wch/R6/issues/42 –