2016-11-18 2 views
0

Скажем, у меня есть класс, определенный как следующие:Как я могу отключить пустые слоты для объектов S4?

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

Я хочу, чтобы все было так, что идентификатор является обязательным и myclass без идентификатора является недопустимым объектом. В настоящее время, я получаю следующее:

> 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"