我想创建一个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没有定义类。

最佳答案

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

10-13 06:12