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

Dea*_*ali 10 r r-s3 r6

我有一个R6类,我想S3为它添加一个方法.我发现的文档简要提到,为了使用你必须拥有的S3调度,我找不到应该怎么做的例子.R6class = TRUE

我确实在经验上看到只是简单地在表单中编写S3方法s3generic.r6class,但我想知道这是否确实以正确的方式编写S3方法R6.

例如,假设我有一个R6增强a 的类list

library(R6)

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

问题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()
}
Run Code Online (Sandbox Code Playgroud)

所以现在,如果我有一个对象,mylist <- R6list$new(as.list(letters[1:5]))我可以打电话as.list(mylist)mylist$as.list().是其中一个优先于另一个?

问题2为类
编写S3方法有什么特别之处R6,还是我上面写的足够和正确的方法?我不确定该S3方法是否必须在类定义之外编写,或者如果R6以某种方式提供了在其中编写S3方法的方法,以便所有与该类相关的代码都是本地化的.

Dea*_*ali 5

我问张温斯顿,笔者R6,这个Github上.据他说,上面问题1中提供的代码是为R6类编写S3方法的正确方法.