S4构造函数初始化和原型

S4 constructor initialize and prototype

我正在尝试通过调用构造函数中的有效性方法来构建 S4 对象。

setClass("Person", slot = c(Age = "numeric"))

validityPerson<-function(object){
    if(object@Age < 0)return("Age cannot be negative")
TRUE
}
setValidity("Person", validityPerson)
setMethod("initialize","Person", function(.Object,...){
validObject(.Object)
.Object
})

这段代码有问题,因为我得到

new("Person", Age = 12)
#Error in if (object@Age < 0) return("Age cannot be negative") : 
#argument is of length zero

当然,我希望年龄等于 12。这是一个玩具示例,但我试图了解如何拥有一个初始化方法,该方法可能会执行所有其他初始化,然后检查有效。

根据 ?initialize 帮助页面上的示例,您需要实际初始化对象,否则 none 个插槽将被填充。否则那些 ... 只会吞噬参数而不对它们做任何事情。您可以使用 callNextMethod

调用默认初始化
setMethod("initialize", "Person", function(.Object, ...) {
    .Object <- callNextMethod()
    validObject(.Object)
    .Object
})

setClass 实际上为您做了很多这样的工作。如果您修改第一行以捕获 return:

setClass("Person", slot = c(Age = "numeric")) -> Person

然后你可以用

实例化对象

Person(Age=12).