R-如何实现S4方法的子集替换



我正在编写一个S4类,其中内部数据存储在数据库中,并且该类主要是用于访问和修改数据库中的信息的守门人。该类将具有用于提取和设置某些信息的getInfoAgetInfoA<-之类的方法。

我的问题与以下情况有关:

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

这里的设置器是在分配之前的子集。通常,当数据存储在标准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<-

因此,当您调用getLetters(a)[1:5] <- letters[1:5]时,基本上似乎发生了什么:

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

最新更新