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