R中S4类的有效性检查

时间:2016-07-14 13:41:55

标签: r

我是R的新手,甚至是S4类的新手,并且在有效性检查方面遇到了一些问题。简单地说,它不起作用。这是我的代码:

check_filter_type <- function(object) {
    length_filter_type <- length(object@filter_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(!(object@filter_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

我很确定我误解了它应该如何工作,但在查看了一些教程和示例后,我无法确定我的错误。

1 个答案:

答案 0 :(得分:0)

我相信你需要为你的课写初始化通用。如果您决定编辑插槽,它不会对该课程进行警告(见下文)。

setMethod('initialize', 'filterPreProcessing', 
          function(.Object, filter_type) {
  .Object@filter_type <- filter_type
  validObject(.Object)
  return(.Object)
})

您应该编写一个通用名称来访问和编辑班级中的插槽。

setGeneric('filter_type', function(object) standardGeneric('filter_type'))
setMethod('filter_type', 'filterPreProcessing', function(object) {
  return(object@filter_type)
})
setGeneric('filter_type<-', function(object) standardGeneric('filter_type<-'))
setMethod('filter_type<-', 'filterPreProcessing', 
          function(object, new_filter_type) {
  object@filter_type <- new_filter_type
  validObject(object)
  return(object)
})

带上一粒盐。其他人应该出现并给出更好的答案。