2016-04-01 2 views
2

Я ищу способ проверки объектов S3 в моем пакете Momocs.Можем ли мы объединить гибкость S3 с проверкой представлений S4?

Ранние версии пакета были написаны с использованием S4, а затем я перешел на S3 ради гибкости, потому что пользователи были больше в S3, потому что мне не нужно многократное наследование, etc.. Основная стоимость этого изменения фактически потеряла проверку/проверку достоверности S4.

Моя проблема заключается в следующем: как мы можем предотвратить непреднамеренное «unvalidate» S3-объект, например, пытающийся расширить существующие методы или манипулировать структурой объекта?

Я уже написал функцию validate, но до сих пор я проверяю только до критических шагов, как правило, превращая объект из класса в другой.

Мой вопрос:

  • я хочу, чтобы мой торт и съесть его (гибкость S3 и S4 представление проверки)? В этом случае мне нужно будет добавить функцию validate во все методы моего пакета?
  • или есть более умный способ сверху S3, что-то вроде «когда-нибудь мы что-то делаем на объекте определенного класса, вызываем функцию на нем»?

ответ

2

Проще всего было бы написать функцию проверки для каждого класса и передать через нее объекты перед отправкой метода S3 или в метод каждого класса. Вот пример с простой функцией проверки называется check_example_class для объекта класса "example_class":

check_example_class <- function(x) { 
    stopifnot(length(x) == 2) 
    stopifnot("a" %in% names(x)) 
    stopifnot("b" %in% names(x)) 
    stopifnot(is.numeric(x$a)) 
    stopifnot(is.character(x$b)) 
    NULL 
} 
print.example_class <- function(x, ...) { 
    check_example_class(x) 
    cat("Example class object where b =", x$b, "\n") 
    invisible(x) 
} 

# an object of the class 
good <- structure(list(a = 1, b = "foo"), class = "example_class") 

# an object that pretends to be of the class 
bad <- structure(1, class = "example_class") 

print(good) # works 
## Example class object where b = foo 
print(bad) # fails 
## Error: length(x) == 2 is not TRUE 
+0

У меня уже есть такая [вещь] (https://github.com/vbonhomme/Momocs/blob/master/R/ cl-validate.R), но я хотел бы знать, могу ли я избежать добавления его повсюду. Подведение его в 'print' - очень хороший трюк! –

+1

@VincentBonhomme Это компромисс между S3 и S4. Вы должны проверить вручную, потому что S3 буквально просто отбрасывает атрибут класса; он не предоставляет никакой другой инфраструктуры для какой-либо проверки. – Thomas

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