4

在我的包中,我想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
}

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

任何提示表示赞赏!

4

1 回答 1

4

也许这个答案提供了更广泛的解释。一种模式是提供基类的实例作为类构造函数的未命名参数

.MyInheritedClass <- setClass("MyInheritedClass", contains="TheBaseClass")
.MyInheritedClass(initBase())

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

.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
})

这种模式要求基类的初始化方法设计正确。在行动:

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

Slot "a":
numeric(0)
于 2013-05-11T00:42:31.103 回答