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