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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。