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 |
如果是 |
S3Class |
要存储为对象中的 S3 类槽的 |
classDef |
类定义对象,由 其余参数仅适用于替换版本,不推荐使用。 |
needClass |
要求替换值是此类或其子类。 |
value |
对于 对于 |
职能
S3Part
:将 contains=
参数中出现的 S3 类中的对象返回给 setClass
。
如果使用 strictS3 = TRUE
调用,S3Part()
将通过消除所有正式定义的槽并关闭对象的 S4 位来构造底层 S3 对象。对于strictS3 = FALSE
,返回的对象来自相应的 S4 类。为了一致性和通用性,S3Part()
也适用于扩展基本向量、矩阵和数组类的类。
对于严格情况,调用等效于将对象强制为类"S3"
,或者对于非严格情况,将对象强制为特定的 S3 类。 as()
调用通常更容易让读者理解。
S3Class
:如果该类具有相应的 .S3Class
槽,则返回存储在对象中的 S3 类的字符向量。目前,该函数默认为class
。
isXS3Class
:根据ClassDef
定义的类是否扩展了S3类(具体来说,是否具有保存S3类的槽),返回TRUE
或FALSE
。
slotsFromS3
:返回相关槽类的列表,或任何其他对象的空列表。
函数 slotsFromS3()
是内部使用的通用函数,用于访问与对象的 S3 部分关联的槽。当使用 S4Class
参数调用 setOldClass
时,会自动创建此函数的方法。通常,只有一个 S3 槽,包含 S3 类,但 S4Class
参数可能会提供额外的槽,以防 S3 类具有一些可用作正式 S4 槽的保证属性。请参阅 setOldClass
文档中的相应部分。
包含的 S3 对象
注册 S3 类定义 S4 类。该类的对象在内容上与 S3 类的对象基本相同,但有两个差异。 class()
返回的值始终是 S4 对象的单个字符串,并且 isS4()
在这两种情况下将返回 TRUE
或 FALSE
。请参阅下面的示例。某些 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)
也可以看看
相关用法
- R StructureClasses 基本结构对应的类
- R S4groupGeneric S4组通用函数
- R as 强制对象属于某个类
- R language-class 表示未评估语言对象的类
- R className 类名包含对应的包
- R BasicClasses 基本数据类型对应的类
- R callGeneric 从方法调用当前通用函数
- R findClass 查找类定义
- R setOldClass 注册旧式 (S3) 类和继承
- R ReferenceClasses 具有按引用处理的字段的对象(OOP 样式)
- R MethodsList 方法列表对象
- R setGroupGeneric 创建函数的组通用版本
- R showMethods 显示指定函数或类的所有方法
- R getMethod 获取或测试方法的定义
- R slot 正式类对象中的槽
- R methodUtilities 用于方法和 S-Plus 兼容性的实用函数
- R getClass 获取类定义
- R evalSource 使用源文件中的函数定义,无需重新安装包
- R is 对象是来自类吗?
- R isSealedMethod 检查密封方法或类
- R cbind2 按列或行组合两个对象
- R GenericFunctions 管理通用函数的工具
- R dotsMethods 在方法签名中使用...
- R nonStructure-class 基本类型的非结构 S4 类
- R selectSuperClasses 类的超类(特定类型)
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 S4 Classes that Contain S3 Classes。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。