2012-10-28 11 views
5

Mogę skopiować klasę odniesienia R5, gdy nie zablokowałem jednego z pól, ale nie kopiuje, jeśli jedno z pól jest zablokowane. Przykładowy kod jest następujący (z zakomentowanym komunikatem blokady). Moje pytanie: Dlaczego nie mogę utworzyć kopii instancji z zablokowanym polem przy użyciu metody copy()?Kopiowanie klas referencyjnych R5 z zablokowaną zmienną

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

Odpowiedz

1

To dlatego, że podczas kopiowania instancji, dane pole zostanie przypisany dwukrotnie, co jest zabronione przez śluzy . będzie przypisane najpierw kopiując instance$data wartość do copyInst$data, a po drugie, gdy kopiowanie instance$d.accessor do copyInst$d.accessor, ponieważ d.accessor jest getter/setter, a sposób definiowania go, przypisując to skutkuje przypisuje $data.

Ilustracja:

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