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


R validObject 測試對象的有效性


R語言 validObject 位於 methods 包(package)。

說明

validObject()測試object與其類定義相關的有效性;具體來說,它檢查類定義中指定的所有槽是否都存在,以及槽中的對象是否來自所需的類或該類的子類。

如果對象有效,則返回TRUE;否則,將生成錯誤,報告遇到的所有有效性失敗。如果參數 testTRUE ,則錯誤將作為字符向量返回,而不是生成錯誤。

初始化類中的對象時,initialize() 的默認方法調用 validObject

類定義可能有一個有效性方法,通過調用定義該類的包或環境中的函數 setValidity 來設置(或通過 setClassvalidity 參數)。該方法應該是一個返回 TRUE 或無效的字符串說明的對象的函數。如果存在這樣的方法,它將從 validObject 調用,並且任何失敗的字符串都將包含在結果或錯誤消息中。還將調用為超類定義的任何有效性方法(從 contains= 參數到 setClass )。

用法

validObject(object, test = FALSE, complete = FALSE)

setValidity(Class, method, where = topenv(parent.frame()) )

getValidity(ClassDef)

參數

object

任何對象,但除非對象的類有正式的定義,否則不會發生太多事情。

test

邏輯性;如果 TRUE 且有效性失敗,則該函數返回說明問題的字符串向量。如果testFALSE(默認)有效性失敗會生成錯誤。

complete

邏輯性;如果 TRUE ,則為每個插槽遞歸調用 validObject 。默認為 FALSE

Class

要設置其有效性方法的類的名稱或類定義。

ClassDef

類定義對象,如 getClassDef

method

有效性方法;也就是說,NULL 或隻有一個參數的函數 (object)。與 validObject 一樣,如果對象有效,該函數應返回 TRUE;如果發現任何問題,則應返回一個或多個說明性字符串。與 validObject 不同,它永遠不應該生成錯誤。

where

存儲修改後的類定義的環境。應省略,特別是對於來自定義該類的包的調用。該定義將存儲在包的命名空間中。

細節

有效性測試是“自下而上”進行的,先檢查插槽,然後檢查超類,然後檢查對象自己的有效性方法(如果有)。

對於每個槽和超類,都會檢查指定類是否存在。對於每個槽,都會測試槽中的對象是否從相應的類繼承。如果 completeTRUE ,則為槽中的對象遞歸調用 validObject

然後,對於該類擴展的每個類(‘superclasses’),調用該類的顯式有效性方法(如果存在)。最後,調用 object 類的有效性方法(如果有)。

如果對象有效,validObject 返回TRUE。否則,找到說明問題的字符串向量,但如果 testFALSE ,則有效性失敗會生成錯誤,並在錯誤消息中顯示相應的字符串。

有效性方法

有效性方法必須是一個參數的函數;正式地,該參數應命名為 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.)

也可以看看

setClass;類classRepresentation

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Test the Validity of an Object。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。