2012-10-28 18 views
5

Tôi có thể sao chép lớp tham chiếu R5 khi tôi không khóa một trong các trường, nhưng nó không sao chép nếu một trong các trường bị khóa. Ví dụ mã sau (với cuộc gọi khóa nhận xét). Câu hỏi của tôi: Tại sao tôi không thể tạo một bản sao của cá thể với một trường bị khóa bằng phương thức copy()?Sao chép các lớp tham chiếu R5 bằng biến bị khóa

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

Trả lời

1

Đó là bởi vì khi bạn sao chép các ví dụ, các dữ liệu thực địa sẽ được chỉ định hai lần, mà bị cấm bởi các khóa. Nó sẽ phân công đầu tiên bằng cách sao chép instance$data giá trị vào copyInst$data, và thứ hai khi sao chép instance$d.accessor vào copyInst$d.accessor, vì d.accessor là một getter/setter, và cách bạn định nghĩa nó, gán cho nó kết quả trong chuyển nhượng để $data.

Minh họa:

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 
Các vấn đề liên quan