范围S4类,如何使用超类'构造函数

时间:2013-05-10 23:24:11

标签: r s4

在我的包中,我想从一个贡献包中继承一个类TheBaseClass(所以它超出了我的范围)。有一个用于创建此类对象的函数。以下是该代码的最小示例。

setClass("TheBaseClass", representation(a="numeric"))
initBase <- function() new("TheBaseClass", a=1)  # in reality more complex

现在我只想使用initBase作为我的子类的构造函数,但我不知道如何 设置新类

setClass("MyInheritedClass", contains="TheBaseClass")
initInher <- function() {
    res <- initBase()
    class(res) <- "MyInheritedClass" # this does not work for S4
}

如何更改最后一行才能使其正常工作?复制&amp;粘贴initBase功能不是一个选项,因为它涉及.C调用。我读到了setIs,但这似乎不是正确的功能。

任何暗示都赞赏!

1 个答案:

答案 0 :(得分:3)

或许this answer提供了更广泛的解释。一种模式是提供基类的实例作为类构造函数

的未命名参数
.MyInheritedClass <- setClass("MyInheritedClass", contains="TheBaseClass")
.MyInheritedClass(initBase())

setClass返回一个生成器函数,它与调用new没什么不同但看起来更干净;我在前面使用.,因为生成器可能有点太粗糙了“最终用户“,例如,没有关于参数应该是什么的提示,只是...)。这假设您没有为您的类编写初始化方法,或者您的初始化方法的构造方式与初始化的合同ANY方法一致,并且稍微复杂一些类

.A <- setClass("A", contains="TheBaseClass",
    representation=representation(x="numeric"))

setMethod(initialize, "A",
   function(.Object, ..., x)
{
    x <- log(x)                          # your class-specific initialization...
    callNextMethod(.Object, ..., x = x)  # passed to parent constructor
})

此模式要求已正确设计基类的initialize方法。在行动:

> .A(initBase(), x=1:2)
An object of class "A"
Slot "x":
[1] 0.0000000 0.6931472

Slot "a":
numeric(0)