Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use S3 virtual class as slot of an S4 class, got error: got class "S4", should be or extend class "nls.lm"

Tags:

r

slots

s4

R Version:

    R version 2.15.2 (2012-10-26)
    Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

I want to make an S4 class that use the output object of the function of nls.lm (package: minpack.lm) as a slot:

setOldClass("nls.lm")

setClass (
  Class="TestClass",
  representation=representation(
      lmOutput = "nls.lm",
      anumeric = "numeric"
    )
  )

Now, if I want to call this class in a "constructor function" I can do something like this (correct?):

myConstructor <- function()
{
  return(new("TestClass"))
}

pippo <- myConstructor()

pippo
An object of class "TestClass"
Slot "lmOutput":
<S4 Type Object>
attr(,".S3Class")
[1] "nls.lm"

Slot "anumeric":
numeric(0)

And the object "pippo" seems correctly initialized.

If I use this code instead I got an error:

myConstructor2 <- function()
{
  pippo <- new("TestClass", anumeric=1000)
  return(pippo)
}

pippo <- myConstructor2()
Error in validObject(.Object) : 
 invalid class “TestClass” object: invalid object for slot "lmOutput" in class "TestClass": got class "S4", should be or extend class "nls.lm"

Seems that if I want to INIT in new some slots, this create problem with a S3 Class slot?

Any clue on how to avoid this problem?

Thanks

like image 610
tucano Avatar asked Dec 12 '12 13:12

tucano


1 Answers

Actually, the no-argument constructor returns an invalid object, too, it's just not tested

> validObject(new("TestClass"))
Error in validObject(new("TestClass")) : 
  invalid class "TestClass" object: invalid object for slot "lmOutput"
  in class "TestClass": got class "S4", should be or extend class "nls.lm"

The solution is to provide an appropriate prototype, maybe

setClass (
  Class="TestClass",
  representation=representation(
      lmOutput = "nls.lm",
      anumeric = "numeric"
    ),
  prototype=prototype(
      lmOutput=structure(list(), class="nls.lm")
    )
  )
like image 66
Martin Morgan Avatar answered Nov 10 '22 15:11

Martin Morgan