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

With R S4 classes, is it possible to have non-optional constructor parameters

假设我有一个 S4 class Test,只有一个插槽 name。有效的名称必须至少有一个字符长,因此 Test(name = "Bob") 应该有效,但 Test(name = "") 应该会引发错误。未定义的名称也应该给出错误:Test()

我的class定义为:

Test <- setClass(
    "Test", 
    slots = c(name = "character"), 
    validity = function(object) {

        if (nchar(object@name) == 0) {

            return("name must at least one character long")
        }

        T
    })

在控制台测试class,我发现我的有效性函数没有为未分配的案例执行:

> 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