如何为 S3 对象创建赋值方法?

Cal*_*imo 4 r

我在 R 中有一个 S3 对象,类似于:

myObject <- list(
    someParameter1 = 4,
    someList = 1:10
)
class(myObject) <- "myClass"
Run Code Online (Sandbox Code Playgroud)

我为这个类创建了一个提取方法:

"[.myClass" <- function(x, i) {
    x$someList[i] * x$someParameter1
}
myObject[5]
# 20
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个分配方法(据?Extract我所知,这称为子分配),以便我可以编写:

myObject[5] <- 250
myObject[5]
# 1000
Run Code Online (Sandbox Code Playgroud)

我首先天真地尝试将其写为

"[<-.myClass" <- function(x, i, value) {
    x$someList[i] <- value
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这会替换myObjectvalue. 我怀疑我必须修改xand then assign("someName", x, pos=somewhere),但是我怎样才能可靠地确定someNameandsomewhere呢?

或者有其他方法可以做到这一点吗?

Jos*_*ich 5

您需要返回x

"[<-.myClass" <- function(x, i, value) {
    x$someList[i] <- value
    x
}
Run Code Online (Sandbox Code Playgroud)

如果您不在return函数调用中使用,则将返回最后计算的表达式的值。对于原始函数,表达式的值为value。为了显示:

"[<-.myClass" <- function(x, i, value) {
    print(x$someList[i] <- value)
    x
}
myObject[5] <- 250
# [1] 250 
Run Code Online (Sandbox Code Playgroud)