我想创建一个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
没有定义类。 最佳答案
问题似乎是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)
关于r - 如何在S4类中为稳健的线性模型创建插槽?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26128630/