对于我正在处理的R包(创建一个S4类),我想延迟加载一些数据,直到用户实际要求它(因为它可能需要或不需要加载它需要一点时间) 。这将要求我在其getter(aka accessor)方法中设置一个插槽的值,如果之前没有加载过的话。但我无法将新价值带到"坚持"。这是一个MRE:
setClass("A", representation(value = "numeric"))
setGeneric("value<-", function(x, value) standardGeneric("value<-"))
setGeneric("value", function(x) standardGeneric("value"))
setMethod("value<-", signature("A", "numeric"),
function(x, value)
{
x@value = value
x
})
setMethod("value", signature(x = "A"),
function(x)
{
if(!length(x@value))
value(x) <- 20
x@value
})
这会产生以下结果:
> a <- new("A")
> value(a)
[1] 20
> a
An object of class "A"
Slot "value":
numeric(0)
因此value()函数返回所需的新值(20),但该值实际上并未在对象中更新。在getter中执行x@value <- value
而不是value(x) <- 20
也没有成功。
似乎问题是我没有在我的getter中返回更新的对象(我的setter的方式),但我还有其他东西可以在我的getter(值)中返回。
做正确的方法是什么?
谢谢!
修改
在进一步研究S4传值语义后,我得出的结论是,这是Simply Not Possible™。如果更新了插槽,则必须返回该对象,而您无法返回其他内容。有人可以证实我的结论是正确的吗?