我没有意识到R6中的内置函数实现了这些任务。
然而,有一种方法可以通过使用引用语义成员来自己编写类似的功能。其原因是,参考mebers将在类的所有实例之间共享的声明here
如果R6类包含的也有引用语义(例如,其它R6对象和环境)的任何领域,这些字段应该在初始化方法中填充。如果该字段直接在类定义中设置为引用对象,则该对象将在R6对象的所有实例中共享。
在下面,我将只涵盖B.和C.因为A.已经回答了here(正如问题中提到的那样)。
基本设置
你将不得不“直接在类定义”添加成员引用语义,而且每当创建新实例改变该成员。
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"
注意到,此代码会给你实例标识而不是实例名。
继承
继承这种行为是从父类(又名super
类)调用ID管理非常简单。
名单IDs
现在将包含两种foo
或bar
的情况下,所有的ID。
一个漂亮的包装
如果你想从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而不是名字,但对于一些purpuses这可能是足够的。