【发布时间】:2015-01-23 19:46:56
【问题描述】:
我有一个R6 类,我想为它添加一个S3 方法。我找到的文档简要提到要在R6 上使用S3 调度,您必须拥有class = TRUE,但我找不到应该如何完成的示例。
我确实从经验上看到,简单地以 s3generic.r6class 的形式编写 S3 方法是可行的,但我想知道这是否确实是为 R6 编写 S3 方法的正确方法。
例如,假设我有一个增强 list 的 R6 类
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
为R6 类编写S3 方法有什么特别之处,或者我上面写的内容是否足够且正确?我不确定S3 方法是否必须在类定义之外编写,或者R6 是否提供了一种在其中编写S3 方法的方法,以便与该类相关的所有代码都本地化。
【问题讨论】:
-
R6Class 的默认值是
class=TRUE,所以从某种意义上说,您看到的所有示例都是这种用法的说明。 -
对,
class=TRUE是我上面的代码有效的原因,但我没有看到任何明确展示如何编写 S3 方法的示例,所以我想知道这是否是推荐的做法这个 -
官方的回答(至少目前为止)是我所做的是正确的。 github.com/wch/R6/issues/42
-
所以请把它写成答案,否则你的问题仍然出现在未回答的问题中。