使用 R S4 类,是否可以具有非可选的构造函数参数



假设我有一个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

相关内容

最新更新