【问题标题】:Proper way to implement S3 dispatch on R6 classes在 R6 类上实现 S3 调度的正确方法
【发布时间】:2015-01-23 19:46:56
【问题描述】:

我有一个R6 类,我想为它添加一个S3 方法。我找到的文档简要提到要在R6 上使用S3 调度,您必须拥有class = TRUE,但我找不到应该如何完成的示例。

我确实从经验上看到,简单地以 s3generic.r6class 的形式编写 S3 方法是可行的,但我想知道这是否确实是为 R6 编写 S3 方法的正确方法。

例如,假设我有一个增强 listR6

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 &lt;- R6list$new(as.list(letters[1:5])),我可以调用as.list(mylist)mylist$as.list()。其中一个比另一个更受欢迎吗?

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

【问题讨论】:

  • R6Class 的默认值是class=TRUE,所以从某种意义上说,您看到的所有示例都是这种用法的说明。
  • 对,class=TRUE 是我上面的代码有效的原因,但我没有看到任何明确展示如何编写 S3 方法的示例,所以我想知道这是否是推荐的做法这个
  • 官方的回答(至少目前为止)是我所做的是正确的。 github.com/wch/R6/issues/42
  • 所以请把它写成答案,否则你的问题仍然出现在未回答的问题中。

标签: r r-s3 r6


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多