当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R class 对象类


R语言 class 位于 base 包(package)。

说明

R拥有简单的通用函数机制,可用于面向对象的编程风格。方法调度是根据泛型函数的第一个参数的类进行的。

用法

class(x)
class(x) <- value
unclass(x)
inherits(x, what, which = FALSE)
nameOfClass(x)
isa(x, what)

oldClass(x)
oldClass(x) <- value
.class2(x)

参数

x

a R对象

what , value

命名类的字符向量。 value 也可以是 NULLwhat 也可以是具有 nameOfClass() 方法的非字符 R 对象。

which

影响返回值的逻辑:参见“详细信息”。

细节

在这里,我们说明所谓的“S3”类(和方法)。对于 “S4” 类(和方法),请参阅下面的“正式类”。

许多R对象有一个classattribute,一个字符向量,给出对象所属类的名称继承。 (函数oldClassoldClass<-获取和设置属性,也可以直接完成。)

如果对象没有类属性,则它具有隐式类,特别是 "matrix""array""function""numeric"typeof(x) 的结果(类似于 mode(x) ),但是对于类型 "language"mode "call" ,其中对应函数 call 存在以下额外类: if , while , for , = , <- , ( , { , call

请注意,对于对象x隐式(或 S4)类的,当(S3)泛型函数foo(x)被调用时,方法调度可能使用比返回的更多的类class(x),例如,对于数字矩阵,foo.numeric()方法可适用。准确完整character类的向量UseMethod()使用,可作为.class2(x)自从R版本 4.0.0。 (当考虑 S3 调度时,这也适用于 S4 对象,请参见下文。)

请注意,出于教学、诊断或调试以外的其他原因使用 .class2() 可能是一种误用,而不是明智之举。

NULL 对象(隐式类 "NULL" )不能具有属性(因此没有 class 属性),并且尝试分配类是错误的。

当通用函数 fun 应用于具有类属性 c("first", "second") 的对象时,系统会搜索名为 fun.first 的函数,如果找到,则将其应用于该对象。如果没有找到这样的函数,则会尝试名为fun.second 的函数。如果没有类名产生合适的函数,则使用函数fun.default(如果存在)。如果没有class属性,则尝试隐式类,然后使用默认方法。

函数 class 打印对象继承的类名称向量。相应地,class<- 设置对象继承的类。分配空字符向量或 NULL 会删除类属性,就像 oldClass<- 或直接属性设置一样。虽然显式分配 NULL 来删除该类更清楚,但在例如 class(x) <- setdiff(class(x), "ts") 中使用空向量更自然。

unclass 返回其参数(的副本),并删除其类属性。 (对于无法复制的对象,即环境和外部指针,不允许这样做。)

inherits 指示其第一个参数是否继承自 what 参数中指定的任何类。如果whichTRUE,则返回与what 长度相同的整数向量。每个元素表示class(x)中与what的元素匹配的位置;零表示不匹配。如果 whichFALSE,则 TRUEinherits 返回(如果 what 中的任何名称与任何 class 匹配)。

nameOfClass 是 S3 泛型。 inherits 调用它来获取 what 的类名,从而允许 what 为字符向量以外的值。 nameOfClass 方法预计返回长度为 1 的字符向量。

如果 x 是 S4 对象,则 isa 使用 is 测试 x 是否为 what 中给出的类的对象。否则给出 TRUE 当且仅当 class(x) 的所有元素都包含在 what 中。

inheritsisa 之外的所有函数都是primitive 函数。

正式课程

默认情况下附加的包 methods 中提供了正式类的附加机制,昵称“S4”。对于具有正式类的对象,其名称由 class 作为长度为 1 的字符向量返回,并且方法分派可以在多个参数上进行,而不仅仅是第一个参数。但是,S3 方法选择尝试将 S4 类中的对象视为具有适当的 S3 类属性,就像 inherits 一样。因此,可以为S4类定义S3方法。有关 S4 方法的基本信息以及这些方法与 S3 方法之间的关系,请参阅“Introduction”和“Methods_for_S3”帮助页面。

该函数的替换版本将类设置为提供的值。对于具有正式定义的类,强烈反对以这种方式直接替换类。表达式 as(object, value) 是将对象强制为特定类的方法。

正式类的 inherits 的类似物是 is 。这两个函数的行为一致,但有一个异常:S4 类可以通过显式测试进行条件继承。在这种情况下,is 将测试条件,但 inherits 忽略所有条件超类。

注意

职能oldClassoldClass<-其行为方式与 S-PLUS 5/6 中这些名称的函数相同,R UseMethod调度返回的类class(对于一些插值类:请参阅链接)而不是oldClass.然而,base groupGenerics 调度oldClass为了效率,以及内部通用s 仅调度对象is.object是真的。

例子

x <- 10
class(x) # "numeric"
oldClass(x) # NULL
inherits(x, "a") #FALSE
class(x) <- c("a", "b")
inherits(x,"a") #TRUE
inherits(x, "a", TRUE) # 1
inherits(x, c("a", "b", "c"), TRUE) # 1 2 0

class( quote(pi) )           # "name"
## regular calls
class( quote(sin(pi*x)) )    # "call"
## special calls
class( quote(x <- 1) )       # "<-"
class( quote((1 < 2)) )      # "("
class( quote( if(8<3) pi ) ) # "if"

.class2(pi)               # "double" "numeric"
.class2(matrix(1:6, 2,3)) # "matrix" "array" "integer" "numeric"

也可以看看

UseMethodNextMethod、‘group generic’、‘internal generic

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Object Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。