2016-07-14 3 views
0

Я довольно новичок в R и даже новичок в классах S4 и столкнулся с некоторыми проблемами с проверкой действительности. Проще говоря, он не работает. Вот мой код:Проверка достоверности класса S4 в R

check_filter_type <- function(object) { 
    length_filter_type <- length([email protected]_type) 
    #return("No filter type was specified.") 
    if (length_filter_type == 0L) { 
     return("No filter type was specified.") 
    } 
    possible_filter <- c('cutData', 'generateTimestamps', 
         'loadRawData', 'insertEventEntry', 
         'insertTimestampOffsetEntry', 
         'insertOffsetCorrectedEventEntry') 
    if(!([email protected]_type %in% possible_filter)) { 
     return("An unknown filter type was requested.") 
    } 
    return(TRUE) 
} 

setClass(
    "filterPreProcessing", 
    representation(filter_type = "character"), 
    validity=check_filter_type 
) 

Независимо от характера аргумент я прохожу в качестве FILTER_TYPE, класс получает создан, хотя он не должен, как это определено в моей функции действия.

filter <- new("filterPreProcessing", filter_type="") 
validObject(filter) 
#[1] TRUE 

filter <- new("filterPreProcessing", filter_type="unknown") 
validObject(filter) 
#[1] TRUE 

Я уверен, что я неправильно понять, как он должен работать, но после просмотра ряда руководств и примеров, которые я не могу точно определить, мою ошибку.

+0

Я не могу воспроизвести вашу проблему; попробуйте перезапустить сеанс R и снова проверить свой код. – nrussell

ответ

0

Я считаю, что вам нужно написать инициализировать общий для вашего класса. Он не будет защищать класс, если вы решите изменить слоты (см. Ниже).

setMethod('initialize', 'filterPreProcessing', 
      function(.Object, filter_type) { 
    [email protected]_type <- filter_type 
    validObject(.Object) 
    return(.Object) 
}) 

Вы должны написать общий доступ для доступа и редактирования слотов в своем классе.

setGeneric('filter_type', function(object) standardGeneric('filter_type')) 
setMethod('filter_type', 'filterPreProcessing', function(object) { 
    return([email protected]_type) 
}) 
setGeneric('filter_type<-', function(object) standardGeneric('filter_type<-')) 
setMethod('filter_type<-', 'filterPreProcessing', 
      function(object, new_filter_type) { 
    [email protected]_type <- new_filter_type 
    validObject(object) 
    return(object) 
}) 

Возьмите это с солью. Кто-то еще должен прийти и дать лучший ответ.

Смежные вопросы