在R6类上实现S3调度的正确方法

时间:2015-01-23 19:46:57

标签: r r-s3 r6

我有一个R6类,我想为它添加一个S3方法。我发现的文档简要提到,为了在S3上使用R6发送,您必须拥有class = TRUE,但我无法找到应该如何完成的示例。< / p>

我确实在经验上看到只是以s3generic.r6class形式编写S3方法,但我想知道是否确实以正确的方式为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方法的方法,以便所有与课程相关的代码已本地化。

1 个答案:

答案 0 :(得分:5)

我问R6的作者Winston Chang,关于on Github。据他介绍,上面问题1中提供的代码是为R6类编写S3方法的正确方法。