我想创建一个具有插槽的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"
(因为lm
和rlm
都是列表),但这会产生类似的错误。插槽是否需要不同的类类型?我还尝试设置a="rlm"
,但rlm
未定义类。
答案 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)