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


R S3Part 包含 S3 类的 S4 类


R语言 S3Part 位于 methods 包(package)。

说明

常规 (S4) 类可能包含 S3 类,如果该类已注册(通过调用 setOldClass )。此处说明的函数提供有关包含的 S3 类的信息。请参阅“函数”部分。

在现代R,使用 S4 类的对象进行编程时通常不需要这些函数。标准计算按预期工作,包括 S4 和 S3 的方法选择。要将对象强制为其包含的 S3 类,请使用以下任一表达式:

as(object, S3Class); as(object, "S3")

其中 S3Class 计算结果为所包含类的名称。这些返回的对象略有不同,在极少数情况下可能需要区分。请参阅“包含的 S3 对象”部分。

用法

S3Part(object, strictS3 = FALSE, S3Class)

S3Class(object)

isXS3Class(classDef)

slotsFromS3(object)

## the replacement versions of the functions are not recommended
## Create a new object from the class or use the replacement version of as().


S3Part(object, strictS3 = FALSE, needClass = ) <- value

S3Class(object) <-  value

参数

object

来自扩展已注册 S3 类的某个类的对象,或者基本向量、矩阵或数组对象类型。

对于大多数函数,还可以提供 S3 对象,解释为它是它自己的 S3 部分。

strictS3

如果是 TRUE ,则 S3Part 返回的值将是一个 S3 对象,并删除所有 S4 插槽。否则,将始终返回一个 S4 对象;例如,从 setOldClass 创建的 S4 类作为 S3 类的代理,而不是底层的 S3 对象。

S3Class

要存储为对象中的 S3 类槽的 character 向量。通常,默认情况下,保留 object 中的槽,但允许使用 S3 超类。

classDef

类定义对象,由 getClass 返回。

其余参数仅适用于替换版本,不推荐使用。

needClass

要求替换值是此类或其子类。

value

对于 S3Part<- ,对象的 S3 部分的替换值。

对于 S3Class<- ,将在 S3 方法调度中用作 class(x) 代理的字符向量。

职能

S3Part :将 contains= 参数中出现的 S3 类中的对象返回给 setClass

如果使用 strictS3 = TRUE 调用,S3Part() 将通过消除所有正式定义的槽并关闭对象的 S4 位来构造底层 S3 对象。对于strictS3 = FALSE,返回的对象来自相应的 S4 类。为了一致性和通用性,S3Part() 也适用于扩展基本向量、矩阵和数组类的类。

对于严格情况,调用等效于将对象强制为类"S3",或者对于非严格情况,将对象强制为特定的 S3 类。 as() 调用通常更容易让读者理解。

S3Class :如果该类具有相应的 .S3Class 槽,则返回存储在对象中的 S3 类的字符向量。目前,该函数默认为class

isXS3Class :根据ClassDef定义的类是否扩展了S3类(具体来说,是否具有保存S3类的槽),返回TRUEFALSE

slotsFromS3 :返回相关槽类的列表,或任何其他对象的空列表。

函数 slotsFromS3() 是内部使用的通用函数,用于访问与对象的 S3 部分关联的槽。当使用 S4Class 参数调用 setOldClass 时,会自动创建此函数的方法。通常,只有一个 S3 槽,包含 S3 类,但 S4Class 参数可能会提供额外的槽,以防 S3 类具有一些可用作正式 S4 槽的保证属性。请参阅 setOldClass 文档中的相应部分。

包含的 S3 对象

注册 S3 类定义 S4 类。该类的对象在内容上与 S3 类的对象基本相同,但有两个差异。 class() 返回的值始终是 S4 对象的单个字符串,并且 isS4() 在这两种情况下将返回 TRUEFALSE。请参阅下面的示例。某些 S3 代码几乎不可能与 S4 对象一起工作;如果是这样,请使用 as(x, "S3")

扩展 S3 类的类中的对象将具有一些基本类型和可能的一些属性。对于具有等效 S4 定义的 S3 类(例如 "data.frame" ),扩展 S4 类将具有数据部分和槽。对于其他 S3 类(例如, "lm" ),扩展 S4 类中的对象将是某种基本类型,几乎总是向量类型(例如, "list" 表示 "lm" ),但数据部分不会具有一个正式的定义。

通过调用 setOldClass 注册 S3 类会创建一个同名的类,并使用槽 ".S3Class" 来保存相应的类字符串 S3 向量。扩展此类的新 S4 类也具有相同的槽,设置为所包含的 S3 对象的 S3 类,该对象可能是注册类的 (S3) 子类。例如,S4 类可能包含 S3 类 "lm" ,但该类中的对象可能包含类 "mlm" 中的对象,如下面的 "xlm" 示例所示。

R对于 S3 类的处理方式有些随意:"ts"是,但是"matrix""array"不是。对于扩展这些类的类,假设它们包含 S3 类是不正确的,并且会导致一些混乱 - 通常不会造成灾难性的后果,但更好的策略是坚持显式的 “class”。因此as(x, "matrix")而不是as(x, "S3")或者S3Part(x).

S3 和 S4 对象:转换机制

对象位于R有一个内部位,指示是否将该对象视为来自 S4 类。该位通过测试isS4并可以通过以下方式打开或关闭asS4。然而,后一个函数不进行检查或解释;仅当您非常确定每个细节都已正确处理时才应使用它。

作为更友好的替代方案,定义了用于强制虚拟类 "S3""S4" 的方法。表达式as(object, "S3")as(object, "S4") 分别返回S3 和S4 对象。此外,他们尝试以有效的方式进行转换,并在强制转换为 S4 时检查有效性。

表达式 as(object, "S3") 可以通过两种方式使用。对于来自已注册 S3 类之一的对象,表达式将确保类属性是 class(object) 隐含的完整 multi-string S3 类。如果注册的类具有已知的属性/槽,也将提供这些属性/槽。

as(object, "S3") 的另一个用途是获取 S4 对象并将其转换为具有相应属性的 S3 对象。这仅对具有数据部分的 S4 类有意义。如果您想在不调用 S4 方法的情况下操作对象,这种转换通常是最安全的方式。

表达式 as(object, "S4") 将使用对象中的属性从 class(object) 的 S4 定义创建对象。这是通过 S3 计算创建 S4 对象的部分定义版本的通用机制(与使用相应参数调用 new 没有太大区别,但即使 S4 对象具有具有不同参数的初始化方法,也可以以这种形式使用)。

例子


## an "mlm" object, regressing two variables on two others

sepal <- as.matrix(datasets::iris[,c("Sepal.Width", "Sepal.Length")])
fit <- lm(sepal ~ Petal.Length + Petal.Width + Species, data = datasets::iris)
class(fit) # S3 class: "mlm", "lm"

## a class that contains "mlm"
myReg <- setClass("myReg", slots = c(title = "character"), contains = "mlm")

fit2 <- myReg(fit, title = "Sepal Regression for iris data")

fit2 # shows the inherited "mlm" object and the title

identical(S3Part(fit2), as(fit2, "mlm"))

class(as(fit2, "mlm")) # the S4 class, "mlm"

class(as(fit2, "S3")) # the S3 class, c("mlm", "lm")

## An object may contain an S3 class from a subclass of that declared:
xlm <- setClass("xlm", slots = c(eps = "numeric"), contains = "lm")

xfit <- xlm(fit, eps = .Machine$double.eps)

xfit@.S3Class # c("mlm", lm")


参考

Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10, particularly Section 10.8)

也可以看看

setOldClass

相关用法


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