我不知道 R6 中用于归档这些任务的内置函数。
然而,有一种方法可以通过使用具有引用语义的成员来自己编写类似的功能。原因是参考成员将在类的所有实例之间共享,如此处所述
如果您的 R6 类包含任何也具有引用语义的字段(例如,其他 R6 对象和环境),则应在初始化方法中填充这些字段。如果该字段直接在类定义中设置为引用对象,则该对象将在 R6 对象的所有实例之间共享。
在下文中,我将仅介绍 B. 和 C.,因为 A. 已在此处得到回答(如问题中所述)。
基本设置
您必须“直接在类定义中”添加具有引用语义的成员,并在创建新实例时更改该成员。
library(R6)
foo <- R6Class(
public = list(
info = new.env(), # member with reference semantics
initialize = function(ID){
self$info$IDs = c(self$info$IDs, ID) # "push_back" new ID
}
)
)
a_name <- foo$new("a_id")
b_name <- foo$new("b_id")
a_name$info$IDs
# [1] "a_id" "b_id"
b_name$info$IDs
# [1] "a_id" "b_id"
请注意,此代码将为您提供实例ID而不是实例名称。
遗产
super
通过从父类(又名类)调用 ID 管理器来继承此行为非常简单。
bar <- R6Class(
inherit = foo,
public = list(
initialize = function(ID){
super$initialize(ID) # use ID management from the super class
}
)
)
c_name <- bar$new("c_id")
c_name$info$IDs
# [1] "a_id" "b_id" "c_id"
该列表IDs
现在将包含foo
或的实例的所有 ID bar
。
一个不错的包装
如果要从foo
对象而不是实例中获取 ID,可以使用以下命令
# add a new "static" function to the R6Class/environment foo
foo$getIDs <- function(){
dummy_instance <- foo$new(NULL) # inserting NULL in an unnamed list does nothing
dummy_instance$info$IDs
}
foo$getIDs()
# [1] "a_id" "b_id" "c_id"
我知道这不是你所要求的,因为这个 appriach 会给你 ID 而不是名字,但对于某些目的来说,这可能就足够了。