如何使 S4 class 从另一个 S4 class 正确继承?

How to make an S4 class inherit correctly from another S4 class?

我正在创建两个 S4 classes,其中 class Employee 继承自另一个 class Person。

两个class的定义如下:

setClass("Person", slots = list(name="character", age="numeric"))

setClass("Employee", slots = list(boss="Person"))

我正在为这两个 class 中的每一个创建一个实例,

alice <- new("Person", name="Alice", age = 40)

这很好用,但是当我尝试使用以下方法创建 Employee 实例时:

john <- new("Employee", name = "John", age = 20, boss= alice)

它给出如下错误:

Error in initialize(value, ...) : 
  invalid names for slots of class “Employee”: name, age

我不能以这种方式创建对象吗?

根据 nrussel 的评论:

函数 setClass 的参数 contains 处理继承。您希望 class Employee 从 class Person 继承(即员工是一种特殊类型的人)。所以

setClass("Person", slots = list(name="character", age="numeric"))
setClass("Employee", slots = list(boss="Person"), contains = "Person")

会成功的。

> alice <- new("Person", name="Alice", age = 40)
> john <- new("Employee", name = "John", age = 20, boss= alice)
> john
An object of class "Employee"
Slot "boss":
An object of class "Person"
Slot "name":
[1] "Alice"

Slot "age":
[1] 40


Slot "name":
[1] "John"

Slot "age":
[1] 20