2016-04-01 6 views
2

Paketim Momocs adresindeki S3 nesnelerini doğrulamak için bir yöntem arıyorum.S3 esnekliğini S4 gösterim denetimi ile birleştirebilir miyiz?

Paketin önceki sürümleri S4 kullanılarak yazıldı, sonra esneklik adına S3'e geri döndüm, çünkü kullanıcılar S3'e daha fazla girmişti, çünkü birden fazla kalıtıma gerçekten ihtiyacım yok çünkü etc.. Bu değişikliğin ana maliyeti aslında S4 temsili/geçerlilik kontrolü kaybetti.

Sorunum şöyle: S3 nesnesini istem dışı olarak "geçersiz kılmak", örneğin varolan yöntemleri genişletmeye veya nesne yapısını değiştirmeye çalışmaktan nasıl önleyebiliriz?

Zaten validate işlevini yazmıştım ancak şu ana kadar, yalnızca bir nesneyi bir sınıftan diğerine çeviren önemli adımlar öncesinde doğrularım.

Sorum şu:

  • benim pasta var ve (kontrol S3 esneklik ve S4 gösterimini) yemek istersin? Bu durumda, paketimin tüm yöntemlerinde validate işlevimi eklemem gerekir mi?
  • veya S3'ün üzerinde daha akıllı bir yol var mı, "belirli bir sınıfın nesnesi üzerinde herhangi bir şey yaptığımız zaman, bir validate işlevini çağır" gibi bir şey var mı?

cevap

2

En kolay şey, her sınıf için bir doğrulama işlevi yazmak ve S3 yönteminin gönderilmesinden önce veya her bir sınıfın yöntemi içinde nesnelerin içinden geçiş yapmaktır. Zaten bu [şey] sahip

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/: burada sınıf "example_class" bir nesne için check_example_class olarak adlandırılan, basit bir doğrulama fonksiyonuna sahip bir örnek cl-validate.R) ama her yere eklemekten kaçınıp alamayacağımı bilmek isterim. 'Print'de onu yazmak çok iyi bir hile! –

+1

@VincentBonhomme Bu, S3 ve S4'ün satılması. Manuel olarak doğrulamak zorundasınız çünkü S3 gerçekten sadece sınıf özniteliğini gönderir; Her türlü doğrulama için başka bir altyapı sağlamamaktadır. – Thomas