5

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

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()
4

1 に答える 1

1

これは、インスタンスをコピーすると、フィールド データが2 回割り当てられるためです。これは、ロックによって禁止されています。instance$dataは getter/setter であり、定義した方法では、値をにコピーすることで最初に値が割り当てられ、にコピーするcopyInst$dataときに 2 番目に割り当てられます。instance$d.accessorcopyInst$d.accessord.accessor$data

イラスト

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
于 2013-07-03T17:04:49.953 に答える