RClassUtils
位于 methods
包(package)。 说明
这些是支持正式类的定义和使用的各种函数。其中大多数很少适合直接调用。
其他一些只是实验性的和/或仅部分实施。正常代码开发请参考setClass
。
用法
classLabel(Class)
.classEnv(Class, default = .requirePackage("methods"), mustFind = TRUE)
testVirtual(properties, extends, prototype, where)
makePrototypeFromClassDef(slots, ClassDef, extends, where)
newEmptyObject()
completeClassDefinition(Class, ClassDef, where, doExtends)
getAllSuperClasses(ClassDef, simpleOnly = TRUE)
superClassDepth(ClassDef, soFar, simpleOnly = TRUE)
isVirtualClass(Class, where)
newBasic(Class, ...)
makeExtends(Class, coerce, test, replace, by, package, slots,
classDef1, classDef2)
reconcilePropertiesAndPrototype(name, properties, prototype,
superClasses, where)
tryNew(Class, where)
empty.dump()
showClass(Class, complete=TRUE, propertiesAreCalled="Slots")
showExtends(ext, printTo = stdout())
possibleExtends(class1, class2,
ClassDef1 = getClassDef(class1),
ClassDef2 = getClassDef(class2, where = .classEnv(ClassDef1)))
completeExtends(ClassDef, class2, extensionDef, where)
classMetaName(name)
methodsPackageMetaName(prefix, name, package = "")
metaNameUndo(strings, prefix, searchForm = FALSE)
requireMethods(functions, signature, message, where)
checkAtAssignment(cl, name, valueClass)
checkSlotAssignment(obj, name, value)
defaultPrototype()
isClassDef(object)
validSlotNames(names)
getDataPart(object, NULL.for.none = FALSE)
setDataPart(object, value, check = TRUE)
assignClassDef(Class, def, where = .GlobalEnv, force = FALSE,
doSubclasses = is(def, "ClassUnionRepresentation"))
completeSubclasses(classDef, class2, extensionDef, where,
classDef2 = getClassDef(class2, where))
newClassRepresentation(...)
函数概要
testVirtual
:-
测试虚拟课程。尽可能地确定具有这些属性、扩展和原型的类是否是虚拟类。可以通过扩展
"VIRTUAL"
强制为虚拟。否则,只有当一个类没有槽、不扩展非虚拟类并且具有
NULL
原型时,该类才是虚拟的。 makePrototypeFromClassDef
:-
使类定义隐含原型。
以下三个规则按此顺序应用。
-
如果类有槽,则默认使用每个槽的原型,但使用
ClassDef
中显式提供的原型中的相应元素(如果有)(但必须强制转换为该槽的类)投币口)。这包括数据部分(".Data"
槽)(如果有的话)。 -
如果没有槽但指定了非空原型,则返回此值。
-
如果存在非虚拟超类(扩展列表中的类),则使用其原型。如果需要,则提取数据部分(允许有两个带有数据部分的超类;使用第一个,并对任何其他超类发出警告)。
如果以上三个都失败,则原型为
NULL
。 -
newEmptyObject
:-
用于创建一个可以在其中设置插槽的空对象的实用函数。
目前仅创建一个类为
"NULL"
的空列表。更高版本应该创建一个特殊的对象引用,标记当前没有插槽和数据的对象。
completeClassDefinition
:-
完成
Class
的定义,相对于环境where
中可见的类定义。如果doExtends
是TRUE
,请填写super-和sub-class信息。当定义或重新定义类时调用此函数。
getFromClassDef
:-
提取本质上定义的类定义属性之一(".Properties" 等)严格来说是一个实用函数。
getSlots
:-
返回一个命名的字符向量。名称是插槽的名称,值是相应插槽的类。参数
x
可以是类的名称或类定义对象。 getAllSuperClasses
、superClassDepth
:-
获取该类定义扩展的所有类的名称。
getAllSuperClasses
是用于完成类定义的实用函数。它以 breadth-first 顺序(这是用于匹配方法的顺序)返回该类可到达的所有超类;也就是说,第一个直接超类后面是它的所有超类,然后是下一个,依此类推。(该顺序仅在某些超类具有多重继承的情况下才相关。)从
getAllSuperClasses
调用的superClassDepth
返回相同的信息,但作为包含组件label
和depth
的列表,后者表示每个类在继承树中的代数。参数soFar
用于避免类关系网络中的循环。 isVirtualClass
:-
指定的类是虚拟类吗?
如果显式声明为虚拟类,或者未正式定义该类,则该类是虚拟的。
assignClassDef
:-
将类的定义分配给专门命名的对象
newBasic
:-
没有正式定义的基本类的函数
new
的实现。其中任何一个都可以有正式定义,
Class="NULL"
除外(不允许,因为NULL
不能有属性)。对于除"NULL"
之外的所有情况,结果的类别将设置为Class
。有关参数的解释,请参阅
new
。 makeExtends
:-
构造一个 SClassExtension 对象,表示从
Class
到classDef2
定义的类的关系。 reconcilePropertiesAndPrototype
:-
使列表或结构看起来像给定类的原型。
具体来说,返回一个结构体,其属性与属性中的槽名称相对应,并且从原型中获取值(如果存在),从类的
new(classi)
中获取,如果成功则从槽的classi
中获取,否则返回NULL
。原型可能暗示插槽不在属性列表中,因为属性不包括继承的插槽(这些插槽在会话中使用该类之前尚未解决)。
tryNew
:-
尝试从此类生成新元素,但如果尝试失败(例如,当类未定义或虚拟时),则仅返回
NULL
。这在实际生成对象时效率很低,也不是一个好主意,但在类的初始定义中很有用。
showClass
:-
打印有关类定义的信息。
如果
complete
是TRUE
,请包含有关扩展的间接信息。它是从
show(getClass(.))
调用的实用程序,用户通常应使用getClass(.)
来查看类定义。 showExtends
:-
打印扩展列表的元素;对于
printTo = FALSE
,返回包含组件what
和how
的列表;例如,promptClass()
使用它。 possibleExtends
:-
查找表明 class1 是否直接或间接扩展 class2 的信息。
这可以是逻辑值,也可以是
SClassExtension
类的对象,其中包含用于测试和/或强制关系的各种函数。 classLabel
:-
返回一个信息字符串,标识该类,如果适用,还标识该类来自的包。
.classEnv
:-
返回环境,通常是命名空间,其中定义了
Class
。Class
通常应该是class()
(因此包含"package"
属性)或getClass
(或getClassDef
)的结果。 completeExtends
:-
通过遵循传递链来完成类定义中的扩展信息。
如果包含
class2
和extensionDef
,则需要添加该类关系。否则只需使用当前的ClassDef
。contains
和subclasses
槽均已完成,任何间接关系都可见。 classMetaName
:-
存储此类定义的对象的名称
methodsPackageMetaName
:-
名称修饰设备,用于隐藏定义方法和类信息的元数据。
metaNameUndo
-
顾名思义,此函数撤消用于生成 meta-data 对象名称的 name-mangling ,并返回类
ObjectsWithPackage
的对象。 requireMethods
:-
对于此签名,需要一个子类来实现通用函数的方法。
对于每个泛型,将调用
setMethod
来定义抛出错误的方法以及提供的消息。requireMethods
函数允许虚拟类需要扩展它们的实际类来实现某些函数的方法,实际上为虚拟类创建 API。否则,将调用相应函数的默认方法,从而导致不太有用的错误消息或(更糟糕的是)默默地产生错误结果。
checkSlotAssignment
、checkAtAssignment
:-
通过查阅类的定义,检查所提供的值是否允许用于此插槽。从分配槽的 C 代码中调用。
对于特权槽(只能由与类本身一起定义的访问器函数设置的槽),类设计者可以选择通过验证要在访问器函数中分配的值,然后使用参数调用
slot<-
来提高效率check=FALSE
,以防止调用checkSlotAssignment
。 defaultPrototype
:-
具有槽的类的原型不是虚拟类,并且不扩展基本类之一。两者都其
class
及其(R内部)类型,typeof()
, 是"S4"
. .InitBasicClasses
、.InitMethodsListClass
、.setCoerceGeneric
:-
这些函数执行类和方法初始化的一部分,并且(仅!)从
.onLoad
调用。 isClassDef
:-
object
是类的表示吗? validSlotNames
:-
返回
names
,除非保留其中一个名称,在这种情况下会出现错误。 (截至撰写本文时,"class"
是唯一保留的插槽名称。) getDataPart
、setDataPart
:-
调用实用程序来实现
object@.Data
。对setDataPart
的调用也用于合并超类原型的数据部分。
例子
typeof(defaultPrototype()) #-> "S4"
## .classEnv()
meth.ns <- asNamespace("methods")
if(get4 <- !any("package:stats4" == search()))
require("stats4")
stopifnot(TRUE
, identical(.classEnv("data.frame"), meth.ns)
, identical(.classEnv(class(new("data.frame"))), meth.ns)
, identical(.classEnv( "mle" ), meth.ns) # <- *not* 'stats4'
, identical(.classEnv(class(new("mle"))), asNamespace("stats4"))
, identical(.classEnv(getClass ("mle") ), asNamespace("stats4"))
)
if(get4) detach("package:stats4")
相关用法
- R ReferenceClasses 具有按引用处理的字段的对象(OOP 样式)
- R RMethodUtils 方法实用程序
- R as 强制对象属于某个类
- R language-class 表示未评估语言对象的类
- R className 类名包含对应的包
- R BasicClasses 基本数据类型对应的类
- R callGeneric 从方法调用当前通用函数
- R findClass 查找类定义
- R setOldClass 注册旧式 (S3) 类和继承
- R MethodsList 方法列表对象
- R setGroupGeneric 创建函数的组通用版本
- R StructureClasses 基本结构对应的类
- R showMethods 显示指定函数或类的所有方法
- R getMethod 获取或测试方法的定义
- R slot 正式类对象中的槽
- R S4groupGeneric S4组通用函数
- R methodUtilities 用于方法和 S-Plus 兼容性的实用函数
- R getClass 获取类定义
- R evalSource 使用源文件中的函数定义,无需重新安装包
- R is 对象是来自类吗?
- R isSealedMethod 检查密封方法或类
- R cbind2 按列或行组合两个对象
- R GenericFunctions 管理通用函数的工具
- R dotsMethods 在方法签名中使用...
- R S3Part 包含 S3 类的 S4 类
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Utilities for Managing Class Definitions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。