假设我有一个S4类Test
,它有一个插槽name
。有效名称的长度必须至少为一个字符,因此Test(name = "Bob")
应该有效,但Test(name = "")
应该引发错误。未定义的名称也应给出错误:Test()
。
我的类定义为:
Test <- setClass(
"Test",
slots = c(name = "character"),
validity = function(object) {
if (nchar(object@name) == 0) {
return("name must at least one character long")
}
T
})
在控制台中测试类,我发现我的有效性函数没有针对未分配的情况执行:
> Test(name = "Bob")
An object of class "Test"
Slot "name":
[1] "Bob"
> Test(name = "")
Error in validObject(.Object) :
invalid class “Test” object: name must at least one character long
> Test()
An object of class "Test"
Slot "name":
character(0)
如何确保在创建无效对象时始终引发错误?
确保 S4 有效性的一种方法是使用 prototype
像这样初始化插槽
Test <- setClass(
"Test",
slots = c(name = "character"),
prototype = prototype(name = 'name_default'),
validity = function(object) {
if (nchar(object@name) == 0) {
return("name must at least one character long")
}
})
Test(name = "Bob")
## An object of class "Test"
## Slot "name":
## [1] "Bob"
Test(name = '')
## Error in validObject(.Object) :
## invalid class "Test" object: name must at least one character long
Test()
## An object of class "Test"
## Slot "name":
## [1] "name_default"
另一种方法是创建一个构造函数来测试名称的存在:
consTest <- function(name) {
if (missing(name)) {
stop("name is missing")
} else {
new(Class = "Test", name = name)
}
}
consTest(name = "Bob") # similar to Test(...)
consTest(name = '') # similar to Test(...)
consTest()
## Error in consTest() (from Retest.R@13#3) : name is missing