我沒有意識到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這可能是足夠的。