2013-02-10 30 views
12

S4 nesnelerle ve yuvalarıyla çalışırken biraz deneyimim var, bu yüzden belirli yuvalara ve alt yuvalara nasıl erişileceğini biliyorum. Öğrenmek istediğim şey, bir nesneyi unlist listesinin bir S3 listesini ayırma biçiminde "de-delme" işlemidir.Unlisteye() bir S4 eşdeğer var mı?

lssize<-function(items){ 
      if (any(sapply(sapply(items,get),typeof)=='closure')){ 
     warning('Closures in list, will ignore.') 
     items<-items[(sapply(sapply(bar,get),typeof)=='closure')!=TRUE] 
    } 
    sizes<-sapply(sapply(sapply(sapply(items,get,simplify=F), unlist,simplify=F), as.vector,simplify=F), length) 
    return(sizes) 
    } 

(benim kod :-) gülüyor hiçbir fuarda):
Benim öncelikli hedefi, bir nesnenin elemanlarının sayısını döndürür benim oyuncakların birine bir S4 muadili sahip olmaktır. Ben onları dönüştürmek için bir kerede bir tane yuvaları ayıklayan bir yineleme rutin yazmak zorunda kalmamayı umuyoruz.

Düzenleme: Biliyorum object.size bytecount döndürecektir; burada olduğum şey değil.

+1

Sen str 'bir göz (sahip olmak isteyebilirsiniz)' ('utils ::: str .default 'gerçekten) - S4 nesnelerine uygulandığında hem sonuçları hem de S4 nesnesinin tüm yuvalarında gezinmek için kullandığı kod. –

cevap

9

(Bu, attributes belgesine güvenmek yerine slotName ve slot kullanarak önceki, silinmiş bir cevaba daha yakın olacak şekilde değiştirilmiştir). Biz bir örnek bir S4 nesne olup olmadığını test eden bir fonksiyon yazabiliriz ve böylece

f = function(x) { 
    if (isS4(x)) { 
     nms <- slotNames(x) 
     names(nms) <- nms 
     lapply(lapply(nms, slot, object=x), f) 
    } else x 
} 

ve liste halinde bütün yuvaları ayıklar ve recurses o zaman

A = setClass("A", representation(x="numeric")) 
B = setClass("B", representation(a="A", b="numeric")) 
f(B()) 

bir düz eski listeye ulaşmak için İstediğimiz amaçlar için kullanabiliriz.

$a 
$a$x 
numeric(0) 

$a$class 
[1] "A" 
attr(,"package") 
[1] ".GlobalEnv" 


$b 
numeric(0) 

$class 
[1] "B" 
attr(,"package") 
[1] ".GlobalEnv" 

fsetOldClass ile S3 sınıflarından yapılır NULL değerleri veya S4 sınıfı işlemek için, örneğin, geliştirilmiş gerekebilir. validObject kodu, daha kapsamlı bir geçiş için arama yapabileceğim yerlerden biri olacaktır.

visitLeavesWith <- 
    function(object, FUN, ...) 
{ 
    f = function(x) { 
     if (isS4(x)) { 
      slots <- setNames(slotNames(x), slotNames(x)) 
      lapply(lapply(slots, slot, object=x), f) 
     } else FUN(x, ...) 
    } 
    f(object) 
} 

örneğin çizgisinde bir genelleme bir ziyaretçiyi hale getirebileceğini

,

visitLeavesWith(B(), length) 
+0

Bu hoş görünüyor - (çıkarılmış) diğer cevabın iyi bir şekilde iyileştirilmesi. Evet, muhtemelen "dönüştürmek", öğe sayılarından ziyade baytların boyutlarını bildirmek zorundayım :-) –

+0

Sadece bir kez :-) 'yi kabul ediyorum. Kodunuzu yaymak için zaman ayırdığınız için teşekkür ederiz. (If) 'lssize' içeren bir yardımcı araçlar paketi oluşturduğumda size tam kredi vereceğim. –

+0

BTW, bu yüzden doğru adamı krediliyorum - Fred H.'de çalışan siz misiniz? –

İlgili konular