我在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)
,但我怎样才能可靠地确定someName
和somewhere
?
或者有不同的方法吗?
答案 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。