我正在编写一个S4类,其中内部数据存储在数据库中,该类主要是用于访问和修改数据库中信息的守门员.这个类必须的方法,如getInfoA与getInfoA<-用于提取和设置的某些信息.
我的问题涉及以下案例:
myObject <- new('myClass', db='path/to/database')
getInfoA(myObject)[1:5] <- letters[1:5]
Run Code Online (Sandbox Code Playgroud)
这里的setter在赋值之前是子集的.通常,当数据存储在标准R结构中时,这会自动解决,但是当数据存储在别处时如何正常处理?[<-R中有一个原语,但我不清楚调度是如何进行的,以及在何处以及如何拦截它......
遗憾的是我对此没有很好的解释,但它是开箱即用的。也许 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) {
x@letters
})
setReplaceMethod("getLetters", c("myClass", "character"), function(x, value) {
message("value: ", paste0(value, collapse=", "))
x@letters <- 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<-
Run Code Online (Sandbox Code Playgroud)
因此,当您致电时,基本上会发生getLetters(a)[1:5] <- letters[1:5]以下情况:
value <- getLetters(a)
value <- c(letters[1:5], value[6:10])
a <- `getLetters<-`(a, value=value)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |