當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。