类槽与初始化签名不匹配

时间:2012-03-31 16:08:13

标签: oop r s4

考虑以下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的签名必须与类具有的插槽匹配,否则等待发生的问题。我错了吗?

1 个答案:

答案 0 :(得分:3)

要求是new调用没有参数new("Foo"),必须有效。此外,初始化方法可能更好的做法是将...转换为callNextMethod,并在<{em> ...后生成参数(因为initialize记录为使用未命名的参数来初始化包含的类)。所以

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

通常,人们希望将用户与新用户隔离,而是使用构造函数Foo。通常,构造函数会执行您可能具有的任何强制,而不是放入initialize方法,因此只是未指定initialize方法。

Foo <- function(a=integer(), b=integer(), ...) {
    model <- data.frame(a, b)
    new("Foo", model=model, ...)
}