2016-03-21 80 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