2012-10-28 8 views
5

Ich kann eine R5-Referenzklasse kopieren, wenn ich eines der Felder nicht gesperrt habe, aber es wird nicht kopiert, wenn eines der Felder gesperrt ist. Beispielcode folgt (der Sperraufruf wurde auskommentiert). Meine Frage: Warum kann ich die Instanz mit einem gesperrten Feld nicht mit der Methode copy() erstellen?Kopieren von R5-Referenzklassen mit einer gesperrten Variablen

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

Antwort

1

Es liegt daran, dass, wenn Sie die Instanz zu kopieren, werden die Felddaten zweimal zugewiesen werden, die durch das Schloss verboten ist. Es wird zunächst durch Kopieren instance$data Wert in copyInst$data zugewiesen, und die zweite, wenn Kopieren instance$d.accessor in copyInst$d.accessor, weil d.accessor ist ein Getter/Setter, und die Art, wie Sie es definiert, die Zuordnung, um es in Abtretungsempfänger zu $data führt.

Illustration:

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