假设我有一个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)
如何确保在创建无效对象时始终抛出错误?
答案 0 :(得分:1)
确保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