2015-01-23 5 views
9

У меня есть класс 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 методов внутри него, чтобы весь код, относящийся к классу, был локализован.

+0

По умолчанию для R6Class является 'class = TRUE', поэтому в некотором смысле все примеры, которые вы видите, являются иллюстрациями такого использования. –

+0

Правильно, 'class = TRUE' является причиной моего кода выше, но я не видел примеров, явно показывающих, как писать метод S3, поэтому мне интересно, является ли это рекомендуемым способом для этого –

+0

Официальный ответ (по крайней мере, сейчас) заключается в том, что то, что я делаю, является правильным. https://github.com/wch/R6/issues/42 –

ответ

4

Я спросил Уинстона Чанга, автора R6, об этом on Github. По его словам, код, приведенный в вопросе 1 выше, является правильным способом написания методов S3 для классов R6.