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