Search code examples
roopzoor-s4

R Instance of S4 object with S3 attribute


I am currently creating a new S4 class which uses a S3 zoo object. I can create a class

setOldClass("zoo")
setClass("rollingSD", slot = c(rollPeriod = "numeric", tsOutput = "zoo"))

This code works fine. Now if I want to create an object as

 riskSD <- new("rollingSD")

This also works fine. However, the following generates an error

riskSD <- new("rollingSD", rollPeriod = 12)
Error in validObject(.Object) :
invalid class “rollingSD” object: invalid object for slot "tsOutput" in class  
"rollingSD": got class "S4", should be or extend class "zoo"

This not clear for me why a default object of the zoo class is not inititated. I also do not know how to fix this.


Solution

  • The problem is caused because R's class mechanism doesn't know how to make a new zoo object. You can fix this by specifying a "prototype":

    setClass(
      "rollingSD",
      slot = c(rollPeriod = "numeric", tsOutput = "zoo"),
      prototype=prototype(
        tsOutput=some_zoo_object
      )
    )
    

    where some_zoo_object is of class zoo. The default prototype for a numeric slot is numeric(), but because you defined the (S4) class zoo yourself, the default is new("zoo") and this isn't defined.