2016-11-18 62 views
0

说我有定义如下一类:如何禁止S4对象的空插槽?

setClass("myclass", slots = list(id="character")) 

我想要的东西是这样的:ID是必需的,myclass没有一个id是无效的对象。在目前,我得到如下:

> new("myclass") 
An object of class "myclass" 
Slot "id": 
character(0) 

我希望设置一个验证功能将帮助:

setValidity("myclass", function(object){ 
    if(length(slot(object, "id")) == 0L){ 
    return("You cannot do that") 
    } 
    return(TRUE) 
}) 

> new("myclass") 
An object of class "myclass" 
Slot "id": 
character(0) 

但不幸的是,它看起来就像空参数会导致绕过验证功能。有没有办法使这种类型的输入无效?

回答

0

我能找到的最好的解决办法是把在构造函数中的验证步骤(这似乎有点乖张的我):

setMethod("initialize", "myclass", function(.Object, id){ 
    if(missing(id)) stop("The id is not allowed to be empty") 
    [email protected] <- id 
    validObject(.Object) 
    return(.Object) 
}) 

现在,这给出了预期的结果:

> new("myclass") 
Error in .local(.Object, ...) : The id is not allowed to be empty 
> new("myclass", id = character()) 
Error in validObject(.Object) : 
    invalid class “myclass” object: You cannot do that 
> new("myclass", id = "a") 
An object of class "myclass" 
Slot "id": 
[1] "a"