2017-07-07 55 views
0

假設我有:使用R6,我如何找到從某個超類繼承的類和對象?

Foo <- R6::R6Class("Foo") 
Bar1 <- R6::R6Class("Bar1", inherit = "Foo") 
Bar2 <- R6::R6Class("Bar2", inherit = "Foo") 

f <- Foo$new() 

答:我可以這樣做

R6::findChildren("Foo") 
[1] "Bar1" "Bar2" 

(我想這一樣R, R6, Get Full Class Name from R6Generator Object,但是包括它是綜合)

B.能我做類似

R6::findInstances("Foo") 
[1] "f" 

C.我可以做類似

b1 <- Bar1$new() 
b2 <- Bar2$new() 
R6::findInstances("Foo") 
[1] "f" "b1" "b2" 

回答

0

我沒有意識到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現在將包含兩種foobar的情況下,所有的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這可能是足夠的。