Skip to content
Prev 15822 / 63461 Next

S4 extends a class, but .Data slot has different class

giles.heywood@uk.abnamro.com wrote:

            
Well, it seems to be an implication of how classes work.

An object from an S4 class is implemented in R by slots (which are in 
fact attributes).  The .Data "slot", if there is one, is special that it 
is in fact the actual vector of data to which the real slots are 
attached.  This implementation makes many things back-compatible that 
would not be otherwise.

The .Data slot of class B is inherited in your example from the .Data 
slot of class A & therefore it has class "character" as illustrated.

writing

setClass("B",representation("A"))

does NOT say to make "A" the .Data slot of "B".  It says that "B" should 
inherit all the slots of "A".  The fact that extending a basic vector 
class DOES implicitly define the .Data slot is a somewhat special case.

In R, we would prefer for stylistic reasons to write the above as:

setClass("B", contains = "A")

This has the exact same effect, I think, but is perhaps clearer in 
saying that "B" should contain all the same slots as "A" (and therefore, 
should have a .Data slot of class "character").