在我的包中,我想从一个贡献包中继承一个类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
,但这似乎不是正确的功能。
任何暗示都赞赏!
答案 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)