2015-05-04 65 views
8

我正在編寫一個S4類,其中內部數據存儲在數據庫中,並且該類主要是用於訪問和修改數據庫中信息的守門人。該課程將提供諸如getInfoAgetInfoA<-的方法來提取和設置某些信息。如何實現S4方法的子集替換

我的問題涉及到以下情況:

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

這裏設置器分配之前子集。通常,當數據存儲在標準R結構中時,它會自動解析,但當數據存儲在其他位置時如何正確處理?在R中有一個原始的[<-,但是我不清楚調度如何以及在哪裏和如何攔截它......

回答

1

可悲的是我沒有很好的解釋,但它開箱即用。 也許一位R專家可以澄清這一點。

主要的原因可能是是R永遠不會取代任何東西,但創建對象的新副本 (與像原始的運營商有一些例外,例如[[<- 是否有地方更換某些條件下)。

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

所以,當你調用getLetters(a)[1:5] <- letters[1:5]發生什麼基本上似乎是這樣的:

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

這是一個遺憾 - 爲尋找到它,雖然它有效地削弱了替代存儲方法抽象...謝謝 – ThomasP85