gpt4 book ai didi

r - Extent S4 类,如何使用父类(super class)的构造函数

转载 作者:行者123 更新时间:2023-12-02 00:09:08 25 4
gpt4 key购买 nike

在我的包中,我想子类化一个类 TheBaseClass来自一个贡献的包(所以它超出了我的能力范围)。有一个用于创建此类对象的函数。这是该代码的最小示例。

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

现在我只想使用 initBase作为我的子类的构造函数,但我不知道如何
设置新类(class)
setClass("MyInheritedClass", contains="TheBaseClass")
initInher <- function() {
res <- initBase()
class(res) <- "MyInheritedClass" # this does not work for S4
}

如何更改最后一行以使其工作?复制并粘贴 initBase function 不是一个选项,因为它涉及 .C称呼。我读过 setIs ,但这似乎不是这里的正确功能。

任何提示表示赞赏!

最佳答案

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

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

( setClass 返回一个生成器函数,与调用 new 确实没有什么区别,但看起来更干净;我在前面使用了 .,因为生成器对于“最终用户”来说可能有点过于粗糙,例如,没有暗示参数应该是什么,只是 ... )。这假设你没有为你的类写过 initialize 方法,或者你的 initialize 方法是以一种与 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
})

此模式要求基类的 initialize 方法已正确设计。在行动:
> .A(initBase(), x=1:2)
An object of class "A"
Slot "x":
[1] 0.0000000 0.6931472

Slot "a":
numeric(0)

关于r - Extent S4 类,如何使用父类(super class)的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492142/

25 4 0
文章推荐: clojure - 在每个相邻元素上调用函数时将序列缩减为更短的序列
文章推荐: 使用 seek 同步多个 HTML5 音轨
文章推荐: mathjax - 如何以编程方式将 MathJax LaTeX 格式应用于
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com