4

我在 R 中有一个 S3 对象,例如:

myObject <- list(
    someParameter1 = 4,
    someList = 1:10
)
class(myObject) <- "myClass"

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

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

现在我想创建一个赋值方法(?Extract据我所知,这叫做子赋值),这样我就可以写:

myObject[5] <- 250
myObject[5]
# 1000

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

"[<-.myClass" <- function(x, i, value) {
    x$someList[i] <- value
}

但由于某种原因,这替换myObjectvalue. 我怀疑我必须修改x然后assign("someName", x, pos=somewhere),但我怎样才能可靠地确定someNamesomewhere

还是有其他方法可以做到这一点?

4

2 回答 2

5

您需要返回x

"[<-.myClass" <- function(x, i, value) {
    x$someList[i] <- value
    x
}

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

"[<-.myClass" <- function(x, i, value) {
    print(x$someList[i] <- value)
    x
}
myObject[5] <- 250
# [1] 250 
于 2013-10-31T16:10:20.917 回答
2

为了补充 Joshua Ulrich 的出色回答,您需要返回的原因x是因为 R 翻译

myObject[5] <- 250

进入

myObject <- `[<-.myClass`(myObject, 5, 250)

立即清楚为什么需要返回xmyObject在函数之外):返回值被分配给 myObject。

于 2014-01-19T20:11:44.153 回答