S4构造函数和原型

6

浏览 Hadley Wickham 的 S4 wiki:https://github.com/hadley/devtools/wiki/S4

setClass("Person", representation(name = "character", age = "numeric"), 
  prototype(name = NA_character_, age = NA_real_))
hadley <- new("Person", name = "Hadley")

我们如何为Person设计一个构造函数(类似于这样)
Person<-function(name=NA,age=NA){
 new("Person",name=name,age=age)
}

不执行此操作的代码:

> Person()
Error in validObject(.Object) : 
  invalid class "Person" object: 1: invalid object for slot "name" in class "Person": got class "logical", should be or extend class "character"
invalid class "Person" object: 2: invalid object for slot "age" in class "Person": got class "logical", should be or extend class "numeric"

更新:setClass返回一个默认构造函数:Person <- SetClass(“Person”,...) - ctbrown
2个回答

4
看起来答案就在你的例子里:
Person<-function(name=NA_character_,age=NA_real_){
 new("Person",name=name,age=age)
}

产量
> Person()
An object of class "Person"
Slot "name":
[1] NA

Slot "age":
[1] NA

> Person("Moi")
An object of class "Person"
Slot "name":
[1] "Moi"

Slot "age":
[1] NA

> Person("Moi", 42)
An object of class "Person"
Slot "name":
[1] "Moi"

Slot "age":
[1] 42

然而,这与S4不太相关,并且会复制类定义中已经分配的默认值。也许您更喜欢执行:

Person <- function(...) new("Person",...)

放弃使用命名参数的调用能力?

4

我更倾向于给最终用户一些关于参数类型的提示,而不是像@themel建议使用...。此外,放弃原型并使用length(x@name) == 0作为字段未初始化的指示,使用People类而不是Person,反映R的向量化结构,并在构造函数中使用...,以便派生类也可以使用构造函数。

setClass("People",
    representation=representation(
        firstNames="character",
        ages="numeric"),
    validity=function(object) {
        if (length(object@firstNames) != length(object@ages))
            "'firstNames' and 'ages' must have same length"
        else TRUE
    })

People = function(firstNames=character(), ages=numeric(), ...)
    new("People", firstNames=firstNames, ages=ages, ...)

而且
People(c("Me", "Myself", "I"), ages=c(NA_real_, 42, 12))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接