2017-07-07 69 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这可能是足够的。