S4类:用另一种方法更新槽而不返回对象(R)

时间:2018-05-22 20:25:24

标签: r oop s4

对于我正在处理的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™。如果更新了插槽,则必须返回该对象,而您无法返回其他内容。有人可以证实我的结论是正确的吗?

0 个答案:

没有答案