validObject
位於 methods
包(package)。 說明
validObject()
測試object
與其類定義相關的有效性;具體來說,它檢查類定義中指定的所有槽是否都存在,以及槽中的對象是否來自所需的類或該類的子類。
如果對象有效,則返回TRUE
;否則,將生成錯誤,報告遇到的所有有效性失敗。如果參數 test
是 TRUE
,則錯誤將作為字符向量返回,而不是生成錯誤。
初始化類中的對象時,initialize()
的默認方法調用 validObject
。
類定義可能有一個有效性方法,通過調用定義該類的包或環境中的函數 setValidity
來設置(或通過 setClass
的 validity
參數)。該方法應該是一個返回 TRUE
或無效的字符串說明的對象的函數。如果存在這樣的方法,它將從 validObject
調用,並且任何失敗的字符串都將包含在結果或錯誤消息中。還將調用為超類定義的任何有效性方法(從 contains=
參數到 setClass
)。
用法
validObject(object, test = FALSE, complete = FALSE)
setValidity(Class, method, where = topenv(parent.frame()) )
getValidity(ClassDef)
參數
object |
任何對象,但除非對象的類有正式的定義,否則不會發生太多事情。 |
test |
邏輯性;如果 |
complete |
邏輯性;如果 |
Class |
要設置其有效性方法的類的名稱或類定義。 |
ClassDef |
類定義對象,如 |
method |
有效性方法;也就是說, |
where |
存儲修改後的類定義的環境。應省略,特別是對於來自定義該類的包的調用。該定義將存儲在包的命名空間中。 |
細節
有效性測試是“自下而上”進行的,先檢查插槽,然後檢查超類,然後檢查對象自己的有效性方法(如果有)。
對於每個槽和超類,都會檢查指定類是否存在。對於每個槽,都會測試槽中的對象是否從相應的類繼承。如果 complete
是 TRUE
,則為槽中的對象遞歸調用 validObject
。
然後,對於該類擴展的每個類(‘superclasses’),調用該類的顯式有效性方法(如果存在)。最後,調用 object
類的有效性方法(如果有)。
值
如果對象有效,validObject
返回TRUE
。否則,找到說明問題的字符串向量,但如果 test
是 FALSE
,則有效性失敗會生成錯誤,並在錯誤消息中顯示相應的字符串。
有效性方法
有效性方法必須是一個參數的函數;正式地,該參數應命名為 object
。如果參數具有不同的名稱, setValidity
會進行替換,但在模糊的情況下可能會失敗,因此將參數命名為 object
更為明智。
一個好的方法會檢查所有可能的錯誤並返回一個引用所有發現的異常的字符向量,而不是在第一個異常之後返回。 validObject
將在其錯誤消息或其返回值中累積這些錯誤。
請注意,有效性方法不必檢查超類的有效性:validObject
顯式調用此類方法。
例子
setClass("track",
slots = c(x="numeric", y = "numeric"))
t1 <- new("track", x=1:10, y=sort(stats::rnorm(10)))
## A valid "track" object has the same number of x, y values
validTrackObject <- function(object) {
if(length(object@x) == length(object@y)) TRUE
else paste("Unequal x,y lengths: ", length(object@x), ", ",
length(object@y), sep="")
}
## assign the function as the validity method for the class
setValidity("track", validTrackObject)
## t1 should be a valid "track" object
validObject(t1)
## Now we do something bad
t2 <- t1
t2@x <- 1:20
## This should generate an error
## Not run: try(validObject(t2))
setClass("trackCurve", contains = "track",
slots = c(smooth = "numeric"))
## all superclass validity methods are used when validObject
## is called from initialize() with arguments, so this fails
## Not run: trynew("trackCurve", t2)
setClass("twoTrack", slots = c(tr1 = "track", tr2 ="track"))
## validity tests are not applied recursively by default,
## so this object is created (invalidly)
tT <- new("twoTrack", tr2 = t2)
## A stricter test detects the problem
## Not run: try(validObject(tT, complete = TRUE))
參考
Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)
也可以看看
相關用法
- R as 強製對象屬於某個類
- R language-class 表示未評估語言對象的類
- R className 類名包含對應的包
- R BasicClasses 基本數據類型對應的類
- R callGeneric 從方法調用當前通用函數
- R findClass 查找類定義
- R setOldClass 注冊舊式 (S3) 類和繼承
- R ReferenceClasses 具有按引用處理的字段的對象(OOP 樣式)
- 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 nonStructure-class 基本類型的非結構 S4 類
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Test the Validity of an Object。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。