15

我有一个R6类,我想S3为它添加一个方法。我发现的文档简要提到了要使用S3dispatch on R6you must have class = TRUE,但我找不到应该如何完成的示例。

我确实从经验上看到,简单地以这种形式编写一个 S3 方法是s3generic.r6class有效的,但我想知道这是否确实是S3R6.

例如,假设我有一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为类编写方法
有什么特别之处,或者我上面写的内容是否足够且正确?我不确定该方法是否必须在类定义之外编写,或者是否以某种方式提供了一种在其中编写方法的方法,以便与该类相关的所有代码都本地化。S3R6S3R6S3

4

1 回答 1

6

在 Github 上R6向 的作者 Winston Chang 询问了这个问题。据他介绍,上面问题 1 中提供的代码是为 R6 类编写 S3 方法的正确方法。

于 2015-04-16T19:12:36.100 回答