如何在S4类中为强大的线性模型创建一个插槽?

Wil*_*son 5 r class s4

我想创建一个具有插槽的S4类,它可以保存强大的线性模型.

稳健的线性模型是MASS包装中的一种线性模型.它们包含线性模型所具有的所有信息以及更多信息.

library(MASS)
x <- 1:5
y <- 1:5
mylm <- lm(x~y)
myrlm <- rlm(x~y)
Run Code Online (Sandbox Code Playgroud)

这是我的班级:

.MyClass <- setClass("MyClass", list(a="lm", id="numeric"))
Run Code Online (Sandbox Code Playgroud)

即使.MyClass(a=mylm, id=1)生成了预期的对象,也要初始化rlm失败的对象:

> .MyClass(a=myrlm, id=1)
Error in validObject(.Object) : 
  invalid class “MyClass” object: 1: invalid object for slot "a" in class "MyClass": got class "rlm", should be or extend class "lm"
invalid class “MyClass” object: 2: invalid object for slot "a" in class "MyClass": got class "lm", should be or extend class "lm"
Run Code Online (Sandbox Code Playgroud)

我会想到,因为is(myrlm, "lm")返回TRUE不存在问题,并且对象可以适合插槽.另外,因为它告诉我我创建了一个无效对象两次,为什么第二个说这lm不是自己?是因为lm是虚拟课吗?

我已尝试a="list"在表示中设置(因为lm并且rlm都是列表),但这会产生类似的错误.插槽是否需要不同的类类型?我也试过设置a="rlm",但rlm没有定义类.

nic*_*ola 2

问题似乎在于rlm对象有两个S3类。我建议,作为一种解决方法,在创建对象之前定义一个构造函数并更改插槽的类。沿着这些思路:

   library(MASS)
   x <- 1:5
   y <- 1:5
   mylm <- lm(x~y)
   myrlm <- rlm(x~y)
   .MyClass <- setClass("MyClass", list(a="lm", id="numeric"))
   MyClass<-function(a,id) {
     if (!is(a,"lm")) stop("error")
     class(a)<-"lm"
     new("MyClass",a=a,id=id)
   }
   MyClass(myrlm,1)
Run Code Online (Sandbox Code Playgroud)