2015-05-04 17 views
8

Viết một lớp S4 trong đó dữ liệu nội bộ được lưu trữ trong cơ sở dữ liệu và lớp chủ yếu là một gatekeeper để truy cập và sửa đổi thông tin trong cơ sở dữ liệu. Lớp học sẽ có các phương thức như getInfoAgetInfoA<- để trích xuất và thiết lập một số thông tin nhất định.Cách thực hiện thay thế tập hợp con cho các phương thức S4

Câu hỏi của tôi gắn liền với các trường hợp sau đây:

myObject <- new('myClass', db='path/to/database') 
getInfoA(myObject)[1:5] <- letters[1:5] 

Đây setter được subsetted trước khi chuyển nhượng. Thông thường điều này được giải quyết tự động khi dữ liệu được lưu trữ trong cấu trúc R tiêu chuẩn nhưng làm thế nào để đối phó với điều này một cách duyên dáng khi dữ liệu được lưu trữ ở nơi khác? Có một số nguyên tố [<- trong R nhưng không rõ ràng cách thức gửi đi và địa điểm và cách chặn nó ...

Trả lời

1

Đáng buồn là tôi không có lời giải thích nào cho nó nhưng nó đang hoạt động ra khỏi hộp. Có thể một chuyên gia R có thể làm rõ điều này.

Lý do chính có thể là R không bao giờ thay thế bất cứ điều gì nhưng tạo ra một bản sao mới của đối tượng (với một số ngoại lệ như các nhà khai thác nguyên thủy, ví dụ [[<- rằng có thể thay thế ở vị trí dưới một số điều kiện).

myClass <- setClass("myClass", slots=c(letters="character")) 

setGeneric("getLetters", function(x)standardGeneric("getLetters")) 
setGeneric("getLetters<-", function(x, value)standardGeneric("getLetters<-")) 

setMethod("getLetters", "myClass", function(x) { 
    [email protected] 
}) 

setReplaceMethod("getLetters", c("myClass", "character"), function(x, value) { 
    message("value: ", paste0(value, collapse=", ")) 
    [email protected] <- value 
    x 
}) 

a <- myClass(letters=LETTERS[1:10]) 
tracemem(a) 
# [1] "<0x3716b40>" 
getLetters(a) 
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" 
getLetters(a)[1:5] <- letters[1:5] 
# tracemem[0x3716b40 -> 0x39439c8]: 
# tracemem[0x39439c8 -> 0x3293f70]: 
# value: a, b, c, d, e, F, G, H, I, J 
# tracemem[0x3293f70 -> 0x34aae60]: getLetters<- getLetters<- 

Vì vậy, những gì cơ bản có thể xảy ra khi bạn gọi getLetters(a)[1:5] <- letters[1:5] như sau:

value <- getLetters(a) 
value <- c(letters[1:5], value[6:10]) 
a <- `getLetters<-`(a, value=value) 
+0

Đây là một điều đáng tiếc - nó có hiệu quả cripples trừu tượng hơn các phương pháp lưu trữ thay thế ... thanks for nhìn vào nó mặc dù – ThomasP85

Các vấn đề liên quan