S4构造函数和原型

Jer*_*zig 6 constructor r s4

浏览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")
Run Code Online (Sandbox Code Playgroud)

我们如何为Person设计构造函数(像这样)

Person<-function(name=NA,age=NA){
 new("Person",name=name,age=age)
}
Run Code Online (Sandbox Code Playgroud)

不这样做:

> 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"
Run Code Online (Sandbox Code Playgroud)

the*_*mel 4

看起来答案就在您的示例中:

Person<-function(name=NA_character_,age=NA_real_){
 new("Person",name=name,age=age)
}
Run Code Online (Sandbox Code Playgroud)

产量

> 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
Run Code Online (Sandbox Code Playgroud)

然而,这与 S4 相当不相符,并且会重复类定义中已分配的默认值。也许你更愿意这样做

Person <- function(...) new("Person",...)
Run Code Online (Sandbox Code Playgroud)

并牺牲没有命名参数的调用能力?