2012-10-28 10 views
5

フィールドのいずれかをロックしていないときにR5参照クラスをコピーできますが、フィールドの1つがロックされている場合はコピーされません。ロックコードをコメントアウトして、コード例を次に示します。私の質問:copy()メソッドを使用して、ロックされたフィールドを持つインスタンスのコピーを作成できないのはなぜですか?ロックされた変数を持つR5参照クラスのコピー

example <- setRefClass('example', 
    fields = list(
     count = 'numeric', 
     data = 'data.frame', 
     d.accessor = function(x) { 
      if (!missing(x)) 
       data <<- x 
      else 
       .self$data 
     } 
    ), 
    methods = list(
     initialize = function(data) { 
      if (!missing(data)) 
       d.accessor <<- data 
      count <<- 0 
     }, 
     finalize = function() 
      print('Bye Bye'), 
     accumulate = function(x) 
      count <<- count + x 
    ) 
) 

#example$lock('data') # write-1, read-many 
instance <- example$new() # instantiation 
df <- data.frame(x=1, y=2)# example df 
instance$d.accessor <- df # 1st set - okay! 
copyInst <- instance$copy() 

答えて

1

インスタンスをコピーするとき、フィールドデータがロックによって禁止されて二回を、割り当てられることになるからです。 d.accessorは、ゲッター/セッターであり、あなたがそれに割り当て、それを定義された方法が$dataに割り当てることになるので は、copyInst$d.accessorcopyInst$datainstance$data値をコピーすることによって最初に割り当てられ、そして第二 コピーinstance$d.accessorう。

イラスト

example$lock('data') # write-1, read-many 
instance <- example$new() # instantiation 
df <- data.frame(x=1, y=2)# example df 
instance$data <- df # 1st assignement: OK 
instance$d.accessor <- df #snd assignemnt: ERROR 
Error: invalid replacement: reference class field ‘data’ is read-only 
関連する問題