1

考虑以下 S4 类:

setClass('Foo', representation(model='data.frame'))

setMethod('initialize', 'Foo',
      function(.Object, a, b) {
        .Object@model <- data.frame(a, b)
        .Object
      })

它可以通过以下方式实例化:

new('Foo', a=1:4, b=4:7)

到现在为止还挺好。但是,当我尝试对 Foo 进行子类化时,出现错误。

setClass('Bar', contains='Foo')
>>> Error in data.frame(a, b) : argument "a" is missing, with no default

就个人而言,我更喜欢使用显式参数来实例化类 Foo 因为代码更...嗯,显式。然而,这似乎是不可能的,不是吗?看起来 的签名initialize必须与该类具有的插槽匹配,否则这是一个等待发生的问题。我错了吗?

4

1 回答 1

3

要求是new不带参数调用的new("Foo"), 必须有效。此外,您的 initialize 方法可能更好的做法是在之后使用...、 tocallNextMethod和有参数(因为有文档证明使用未命名的参数来初始化包含的类)。所以...initialize

setMethod(initialize, "Foo", function(.Object, ..., a=integer(), b=integer()) {
    callNextMethod(.Object, ..., model=data.frame(a, b))
})

通常,人们希望将用户与调用 new 隔离开来,而是使用构造函数Foo。通常,构造函数会执行您可能在初始化方法中放入的任何强制,因此未指定初始化方法。

Foo <- function(a=integer(), b=integer(), ...) {
    model <- data.frame(a, b)
    new("Foo", model=model, ...)
}
于 2012-04-01T11:28:09.827 回答