2012-05-25 19 views

cevap

14

DÜZENLEME:

geçmişi biraz vermek için: setClass opsiyonun erişimlerini 'işlevi sadece sınıfla sağlanan Alıcı ve ayarlayıcıların üzerinden erişilebilir olabilir sözde 'imtiyazlı yuvaları' yaratmak için sağlandı . Bu, özel yuvalar oluşturmaya izin verir (bir alıcı sağlamayan), ancak bu özellik hiçbir zaman uygulanmadı.

erişim ve sürümü, S-Plus ile uyumluluk için dahil, fakat anda göz ardı: ?setClass yardım sayfası şu anda okur. Her yuva ulaşılabilir @ gösterimde aracılığıyla olarak


Yani, özel ve kamu yuvaları diye bir şey yoktur. Ve şahsen ben bu konuda çok mutluyum, çünkü pakete dahil olan alıcıları ve ayarlayıcıları kullanarak kolayca erişilemeyen nesnelerden bilgi kullanmamı sağlıyor. Ayrıca, getters ve setter'lar tarafından yaratılan yükten kaçınarak ağır hesaplamaları ekonomik hale getirmemi sağlıyor.

Genel ve "özel" yuvalar arasında ayrım yapmak için herhangi bir adlandırma kuralı olduğunu bilmiyorum. Bir nokta ile "özel" yuvaları önce kendiniz için ayrımı yapabilirsiniz, ancak bu yuvaların nasıl davrandığını etkilemez. Çoğu R programcısı kamu ve özel yuvaları umursamadığı için yaygın bir uygulama değildir. Sadece ortalama kullanıcının ulaşmaması gereken yuvalar için getters ve setters sağlamazlar.

Önemsiz bir örnek vermek gerekirse: Aşağıdakiler iki yuvaya sahip bir sınıf ve yalnızca bir yuva için bir alıcı ve ayarlayıcı oluşturur.

setClass("Example", 
    representation(
    aslot = "numeric", 
    .ahiddenslot = "character" 
) 
) 

setGeneric("aslot", function(x) standardGeneric("aslot")) 

setMethod("aslot","Example",function(x){ 
    [email protected] 
}) 

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-")) 

setMethod("aslot<-","Example",function(x,value){ 
    [email protected] <- value 
    x 
}) 

Ayrıca sadece gizli yuvası çıktısını olmayan bir show yöntemi ayarlayabilirsiniz:

> X <- new("Example",aslot=1,.ahiddenslot="b") 
> X 
Example with value for aslot: 1 
> aslot(X) 
[1] 1 
> aslot(X) <- 3 

Ama .ahiddenslot:

setMethod("show","Example",function(object){ 
    cat("Example with value for aslot: ", [email protected],"\n") 
}) 

Bu aşağıdaki normal kullanım verir hala ulaşılabilir:

> slot(X,".ahiddenslot") 
[1] "b" 
+1

T O bir ". anlam ifade ediyor, çoğunlukla bence bu, ayrım yapmak suretiyle amacım gereği işleri düz tutmama yardımcı olacak. Korundukları gerçekten umrumda değil. –

İlgili konular