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


R RClassUtils 用于管理类定义的实用程序


R语言 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

使类定义隐含原型。

以下三个规则按此顺序应用。

  1. 如果类有槽,则默认使用每个槽的原型,但使用 ClassDef 中显式提供的原型中的相应元素(如果有)(但必须强制转换为该槽的类)投币口)。这包括数据部分(".Data" 槽)(如果有的话)。

  2. 如果没有槽但指定了非空原型,则返回此值。

  3. 如果存在非虚拟超类(扩展列表中的类),则使用其原型。如果需要,则提取数据部分(允许有两个带有数据部分的超类;使用第一个,并对任何其他超类发出警告)。

如果以上三个都失败,则原型为 NULL

newEmptyObject

用于创建一个可以在其中设置插槽的空对象的实用函数。

目前仅创建一个类为 "NULL" 的空列表。

更高版本应该创建一个特殊的对象引用,标记当前没有插槽和数据的对象。

completeClassDefinition

完成 Class 的定义,相对于环境 where 中可见的类定义。如果doExtendsTRUE,请填写super-和sub-class信息。

当定义或重新定义类时调用此函数。

getFromClassDef

提取本质上定义的类定义属性之一(".Properties" 等)严格来说是一个实用函数。

getSlots

返回一个命名的字符向量。名称是插槽的名称,值是相应插槽的类。参数 x 可以是类的名称或类定义对象。

getAllSuperClassessuperClassDepth

获取该类定义扩展的所有类的名称。

getAllSuperClasses 是用于完成类定义的实用函数。它以 breadth-first 顺序(这是用于匹配方法的顺序)返回该类可到达的所有超类;也就是说,第一个直接超类后面是它的所有超类,然后是下一个,依此类推。(该顺序仅在某些超类具有多重继承的情况下才相关。)

getAllSuperClasses 调用的 superClassDepth 返回相同的信息,但作为包含组件 labeldepth 的列表,后者表示每个类在继承树中的代数。参数soFar 用于避免类关系网络中的循环。

isVirtualClass

指定的类是虚拟类吗?

如果显式声明为虚拟类,或者未正式定义该类,则该类是虚拟的。

assignClassDef

将类的定义分配给专门命名的对象

newBasic

没有正式定义的基本类的函数new 的实现。

其中任何一个都可以有正式定义,Class="NULL" 除外(不允许,因为 NULL 不能有属性)。对于除 "NULL" 之外的所有情况,结果的类别将设置为 Class

有关参数的解释,请参阅new

makeExtends

构造一个 SClassExtension 对象,表示从 ClassclassDef2 定义的类的关系。

reconcilePropertiesAndPrototype

使列表或结构看起来像给定类的原型。

具体来说,返回一个结构体,其属性与属性中的槽名称相对应,并且从原型中获取值(如果存在),从类的 new(classi) 中获取,如果成功则从槽的 classi 中获取,否则返回 NULL

原型可能暗示插槽不在属性列表中,因为属性不包括继承的插槽(这些插槽在会话中使用该类之前尚未解决)。

tryNew

尝试从此类生成新元素,但如果尝试失败(例如,当类未定义或虚拟时),则仅返回 NULL

这在实际生成对象时效率很低,也不是一个好主意,但在类的初始定义中很有用。

showClass

打印有关类定义的信息。

如果 completeTRUE ,请包含有关扩展的间接信息。

它是从 show(getClass(.)) 调用的实用程序,用户通常应使用 getClass(.) 来查看类定义。

showExtends

打印扩展列表的元素;对于 printTo = FALSE ,返回包含组件 whathow 的列表;例如,promptClass() 使用它。

possibleExtends

查找表明 class1 是否直接或间接扩展 class2 的信息。

这可以是逻辑值,也可以是 SClassExtension 类的对象,其中包含用于测试和/或强制关系的各种函数。

classLabel

返回一个信息字符串,标识该类,如果适用,还标识该类来自的包。

.classEnv

返回环境,通常是命名空间,其中定义了ClassClass 通常应该是 class() (因此包含 "package" 属性)或 getClass (或 getClassDef )的结果。

completeExtends

通过遵循传递链来完成类定义中的扩展信息。

如果包含class2extensionDef,则需要添加该类关系。否则只需使用当前的 ClassDef

containssubclasses 槽均已完成,任何间接关系都可见。

classMetaName

存储此类定义的对象的名称

methodsPackageMetaName

名称修饰设备,用于隐藏定义方法和类信息的元数据。

metaNameUndo

顾名思义,此函数撤消用于生成 meta-data 对象名称的 name-mangling ,并返回类 ObjectsWithPackage 的对象。

requireMethods

对于此签名,需要一个子类来实现通用函数的方法。

对于每个泛型,将调用 setMethod 来定义抛出错误的方法以及提供的消息。

requireMethods 函数允许虚拟类需要扩展它们的实际类来实现某些函数的方法,实际上为虚拟类创建 API。

否则,将调用相应函数的默认方法,从而导致不太有用的错误消息或(更糟糕的是)默默地产生错误结果。

checkSlotAssignmentcheckAtAssignment

通过查阅类的定义,检查所提供的值是否允许用于此插槽。从分配槽的 C 代码中调用。

对于特权槽(只能由与类本身一起定义的访问器函数设置的槽),类设计者可以选择通过验证要在访问器函数中分配的值,然后使用参数调用 slot<- 来提高效率check=FALSE ,以防止调用 checkSlotAssignment

defaultPrototype

具有槽的类的原型不是虚拟类,并且不扩展基本类之一。两者都其class及其(R内部)类型,typeof(), 是"S4".

.InitBasicClasses.InitMethodsListClass.setCoerceGeneric

这些函数执行类和方法初始化的一部分,并且(仅!)从 .onLoad 调用。

isClassDef

object 是类的表示吗?

validSlotNames

返回names,除非保留其中一个名称,在这种情况下会出现错误。 (截至撰写本文时,"class" 是唯一保留的插槽名称。)

getDataPartsetDataPart

调用实用程序来实现 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-devel大神的英文原创作品 Utilities for Managing Class Definitions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。