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

时间:2013-10-31 15:51:32

标签: r

我在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
}

但出于某种原因,这会将myObject替换为value。我怀疑我必须修改x然后assign("someName", x, pos=somewhere),但我怎样才能可靠地确定someNamesomewhere

或者有不同的方法吗?

2 个答案:

答案 0 :(得分:4)

您需要返回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 

答案 1 :(得分:1)

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

myObject[5] <- 250

进入

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

立即清楚为什么需要返回x(函数外部为myObject):将返回值赋给myObject。