2016-03-21 12 views
0

別の参照クラス内のオブジェクトとして使用する参照クラスがあります。例:R:参照のフィールドReferenceクラスのクラス

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にします。

私は届かないC/Pythonの/ Javaクラスから彼らは完全に違うのRクラスについての根本的な何かがありますように私は感じます。 $ setRefClass()$で代入演算子を使用すると、オブジェクト "class_1"がオブジェクトとして参照しているものがわかりません。また、 "< < - "演算子が "< - "演算子に対してこのコンテキストで使用されることを意図している場合、私は理解できないように感じます。

私には何が欠けていますか?

答えて

1

S4リファレンスクラスの初期化プロセスは常に私を混乱させていましたので、より良い解決策があるかもしれません。 代入演算子は、ローカルメソッド(ローカルメソッド)のみを作成するため、<-の代わりに<<-を使用する必要があります。しかし、あなたのオブジェクトのために定義されたメソッドの囲む環境にあるオブジェクトのフィールドを置き換えたいとします。囲む環境で割り当てを行うには、<<-が必要です。代わりに、私が下の図のために使用する.selfの使用があります - 私が知っている限り、好み以外の違いはありません。

また、initプロセスがあなたの期待に沿うようにあなたの例を修正しました。 setRefClass関数の初期化セクションは読む価値があります。私はあなたが定義したようにinitializerメソッドがinitializeメソッドとは対照的に何かを理解していませんが、本当に欲しいのは後者だと思います。さらに、あなたが参照しているオブジェクトのうち、意味が分かりませんが、どこにも定義されていないようです。とにかく次のことが助けてくれることを願っています

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

関連する問題