R的S4对象(S3对象没有明确类型定义,没有槽)同时具有属性和槽,槽是在类定义时定义的,是类的成员的变量。而属性是一种从外部附加的,可以附加在任何对象上,可被视为某种"标签"。如对象的class属性值,标识了对象所属的类别,可视为class标签标识了对象的类,class属性可以在外部被修改(个人观点:R将对象所属类别信息,暴露在了外部,并可以任意修改,R对象对类并没有很强的归属感,S4对象从名为"a"的类new出,也可以被任意修改为"b"类,即使b类的原型还没有定义,而对象类别信息发生变化,也只是class(对象)<-"b",内部slot等没有任何改变,但是这意味这此对象和a类脱离了关系,以后将不会按属于a类的对象来解释,泛型不会使用调用a类的方法,类似孩子甲过继给了家庭b,虽然甲基因属于a但法律上认为它属于b家庭)。
> setClass("a",representation(data="numeric")) #定义类"a",有一个data槽
> d<-new("a") #new 属于a的对象
> d
An object of class "a"
Slot "data":
numeric(0)
> attributes(d) #列出属性,槽被当作属性
$data
numeric(0)
$class
[1] "a"
attr(,"package")
[1] ".GlobalEnv"
> d@data<-5