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

Sar*_*kar 3 inheritance r r-s4

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

\n\n

这两个类的定义如下:

\n\n
setClass("Person", slots = list(name="character", age="numeric"))\n\nsetClass("Employee", slots = list(boss="Person"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在为这两个类创建一个实例,

\n\n
alice <- new("Person", name="Alice", age = 40)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这效果很好,但是当我尝试使用以下命令创建 Employee 实例时:

\n\n
john <- new("Employee", name = "John", age = 20, boss= alice)\n
Run Code Online (Sandbox Code Playgroud)\n\n

它给出的错误如下:

\n\n
Error in initialize(value, ...) : \n  invalid names for slots of class \xe2\x80\x9cEmployee\xe2\x80\x9d: name, age\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Jor*_*eys 5

根据恩罗塞尔的评论:

contains函数的参数setClass涉及继承。您希望该类Employee继承该类Person(即雇员是一种特殊类型的人)。所以

setClass("Person", slots = list(name="character", age="numeric"))
setClass("Employee", slots = list(boss="Person"), contains = "Person")
Run Code Online (Sandbox Code Playgroud)

会成功的。

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