gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:34:40 28 4
gpt4 key购买 nike

我正在编写一个 S4 类,其中内部数据存储在数据库中,该类主要是用于访问和修改数据库中信息的看门人。该类将具有诸如 getInfoA 之类的方法。和 getInfoA<-用于提取和设置某些信息。
我的问题与以下情况有关:

myObject <- new('myClass', db = 'path/to/database')
getInfoA(myObject)[1:5] <- letters[1:5]
这里 setter 在赋值之前被子集化。通常,当数据存储在标准 R 结构中时,这会自动解决,但是当数据存储在其他地方时如何优雅地处理呢?有一个 [<- R中的原始,但我不清楚调度是如何进行的以及在哪里以及如何拦截它......

最佳答案

可悲的是,我对此没有很好的解释,但它是开箱即用的。
也许 R 专家可以澄清这一点。

主要原因可能是 R 从不替换任何东西,而是创建一个新副本
对象(除了一些异常(exception),如原始运算符,例如 [[<-在某些情况下可以替换到位)。

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)

关于r - 如何实现 S4 方法的子集替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30029164/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com