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

时间:2014-09-30 19:31:43

标签: r class s4

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

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

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(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"

我原以为自is(myrlm, "lm")返回TRUE后就不会出现问题而且该对象可以放入插槽中。此外,既然它告诉我我创建了两次无效对象,为什么第二个说lm本身不是?是因为lm是虚拟类吗?

我尝试在表示中设置a="list"(因为lmrlm都是列表),但这会产生类似的错误。插槽是否需要不同的类类型?我还尝试设置a="rlm",但rlm未定义类。

1 个答案:

答案 0 :(得分:1)

问题似乎是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)