gpt4 book ai didi

oop - 有没有办法初始化 S4 对象以便返回另一个对象?

转载 作者:行者123 更新时间:2023-12-05 03:15:55 25 4
gpt4 key购买 nike

我有一个父类(super class)fb 的类层次结构,其中不应存在任何对象(我尝试了虚拟类但遇到了无法从虚拟类初始化对象的问题)。此外,我有两个具有相同插槽的子类(foobar)。现在我想创建一个新对象,对父类(super class)使用初始化方法,该父类(super class)根据某个值返回其中一个子类的对象:

setClass("fb", representation( x = "numeric"))

setClass("foo", contains = "fb")
setClass("bar", contains = "fb")

setMethod("initialize", "fb", function(.Object, x) {
if (x < 5) class(.Object) <- "foo"
else class(.Object) <- "bar"
.Object@x <- x
.Object
})

> new("fb", x = 3)
Error in initialize(value, ...) :
initialize method returned an object of class "foo" instead of the required class "fb"

显然(并且可能有充分的理由)R 不允许这样做。有没有一种方法可以在方法中实现我想要的,而不是在创建新对象时使用 if-else 构造?

最佳答案

S4 帮助我们在线条内着色。所以你的 fb 类应该是虚拟的,你的 initialize 方法不应该改变 .Object 的类。您可以编写一个函数 fb 来执行您的条件实例化。

setClass("fb", representation( x = "numeric", "VIRTUAL"))
setClass("foo", contains = "fb")
setClass("bar", contains = "fb")

fb <-
function(x)
{
if (x < 5) new("foo", x=x)
else new("bar", x=x)
}

fb 是一个构造函数,对用户来说更方便,并且将类层次结构的接口(interface)与其实现分开,这通常被认为是一件好事。

对于 S4 initialize 方法的隐式约束的值(value)在于 new("foo")(用类调用 new name 但没有附加参数)必须有效(否则当您尝试扩展 foo 时会失败)。所以初始化方法的范例是沿着

setMethod(initialize, "foo", function(.Object, ..., x=1) {
.Object <- callNextMethod(.Object, ...)
.Object@x <- x
.Object
})

尽管通常(如在本例中,initialize 只是进行槽分配)根本不需要初始化方法。注意...的使用,x的定位(要求参数在相应的new调用中命名)和使用的默认值。

关于oop - 有没有办法初始化 S4 对象以便返回另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com