2016-03-21 74 views
0

我有一个引用类,我将其用作另一个引用类中的对象。例如:R:引用类的引用类中的字段引用类

class_1 <- setRefClass(Class = "class_1" 
    , fields = list(nickname = "character", version = "character") 
    , methods = list(
     initializer = function(nickname, version) { 
     nickname <<- nickname 
     version <<- version 
     } 
    ) 
) 

class_2 <- setRefClass(Class = "class_2" 
    , fields = c(version = "character" 
        , nickname = "character" 
        , class_1_item = "class_1") 
    , methods = list(
     initializer = function(class_2_nickname = "B", class_2_version = "V2") { 
     class_1_item <<- class_1$new(class_2_nickname, class_1_version) 
     nickname <<- class_2_nickname 
     version <<- class_2_version 
     } 
    ) 

) 

####### 

class_2_obj <- class_2$new(nickname = "A", version = "V1") 

class_1_obj <- class_1$new(nickname = "A", version = "V1") 

class_2_obj2 <- class_2$new() 

当我调用注释标记后的第一线,它创建了它的内部class_1对象class_2对象,但它从来没有初始化的字段有它的构造函数对象class_1_item称为部分的第一行。然而,当我直接在第2行(在第2类构造函数之外)调用构造函数时,它会初始化这些字段。最后,当我在没有参数的情况下调用第3行的构造函数时,它甚至不会获取默认参数并将所有内容都设为null。

我觉得R类有一些基本的东西,它们与C/Python/Java类完全不同,我没有得到。当我将赋值运算符与$ setRefClass()$一起使用时,我不明白“class_1”对象指向的对象是什么。另外,我觉得我不明白在什么情况下,“< < - ”运营商是打算在本上下文中使用,而不是“<-”运营商。

我错过了什么?

回答

1

S4参考类的初始化过程一直让我困惑,因此可能会有更好的解决方案。您必须使用<<-而不是<-,因为正常的赋值运算符只会进行本地赋值 - 本地赋值给init方法。但是,您希望替换对象中位于为对象定义的任何方法的封闭环境中的字段。要在封闭环境中进行分配,您需要<<-。另一种方法是使用.self,我在下面用于说明 - 据我所知除了偏好以外没有其他区别。

另外我修改了你的例子,以使init过程与你的期望保持一致。 setRefClass函数的初始化部分可能值得阅读。我不知道你定义的initializer方法与initialize方法相反,但我相信它是你真正需要的后者。此外,我无法从你指的class_1_version对象中找出任何意义,但似乎没有任何定义。但我希望以下帮助无论如何。

class_1 <- setRefClass( 
    Class = "class_1", 
    fields = list(nickname = "character", version = "character"), 
    methods = list(
     initialize=function(nickname = NA_character_, version = NA_character_) { 
      .self$nickname <- nickname 
      .self$version <- version 
     } 
    ) 
) 

class_2 <- setRefClass(
    Class = "class_2", 
    fields = c(
     version = "character", 
     nickname = "character", 
     class_1_item = "class_1" 
    ), 
    methods = list(
     initialize=function(nickname = NA_character_, version = NA_character_) { 
      .self$class_1_item <- class_1$new(nickname, version) 
      .self$nickname <- nickname 
      .self$version <- version 
     } 
    ) 
) 
+0

谢谢!那肯定是一个错字,然后 - $ intializer $应该是$ initialize $。 – ecksc