可悲的是我沒有很好的解釋,但它開箱即用。 也許一位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)
這是一個遺憾 - 爲尋找到它,雖然它有效地削弱了替代存儲方法抽象...謝謝 – ThomasP85