2015-12-01 18 views
14

’un S3 gönderimi Belirli bir sınıf için rbind yöntemini yazmayı deniyorum.S3 `rbind` ve` cbind`

> methods("rbind") 
[1] rbind.character rbind.data.frame rbind.rootogram* rbind.zoo*  
see '?methods' for accessing help and source code 
:

rbind.character <- function(...) { 
    do.call("paste", list(...)) 
} 

Bu fonksiyonu girdikten sonra, ben görünüşte o R bildiği geçerli bir yöntem olduğunu teyit edebiliriz: İşte (en azından benim için) çalışmayan bir basit bir örnek

> rbind("abc", "xyz") 
    [,1] 
[1,] "abc" 
[2,] "xyz" 
> #### compared with #### 
> rbind.character("abc", "xyz") 
[1] "abc xyz" 

yardım sayfası aşağıdaki gibi sevk içten gerçekleştirilir söylüyor: onu kullanmaya çalışırsanız

Ancak, tanınmayan

  1. Her bir değişken için sınıf özelliklerinden olası sınıf üyelikleri listesini alırız.
  2. Geçerli bir yönteminin olup olmadığını görmek için sırayla her sınıfı denetleriz.
  3. Geçerli bir yöntem bulursak, önceki argümanlar için belirlenen herhangi bir yöntemin ile aynı olduğundan emin oluruz. Eğer aynı ise, biz biz varız, aksi takdirde hemen varsayılan kodun içine düşüyoruz.

rbind("abc", "xyz") ile, tüm bu ölçütlerin karşılandığına inanıyorum. Ne verir ve nasıl düzeltebilirim?

+2

Bkz. '? InternalMethods' ve ayrıca, x =" abc "gibi bir şey; y = "xyz"; is.object (x) || is.object (y); rbind (x, y); attr (x, "class") = "karakter"; attr (y, "sınıf") = "karakter"; is.object (x) || is.object (y); rbind (x, y) ' –

cevap

9
attributes("abc") 
#NULL 

character numaralı vektörün bir sınıf özelliği yoktur. Ben örtük sınıflar için bir yöntem rbind tarafından gönderilebilir sanmıyorum.

+0

Peki ya sınıf (" abc ") # [1]" karakter "'? – thothal

+2

Sınıf ("abc") 'nin" karakter "olduğunu yanıltıcı görünüyor. –

+5

Bu gizli bir sınıftır. rbind'in metodu sadece sınıf özniteliklerini kontrol eder, yani açık sınıflar. – Roland

3

bir geçici çözüm kendi sınıfını tanımlamak olacaktır:

b <- "abc" 
class(b) <- "mycharacter" 
rbind.mycharacter <- function(...) { 
    do.call("paste", list(...)) 
} 
rbind(b, b) 
# [1] "abc abc" 

o character ile çalışmıyor nedeni güzel onun yorumunda Roland tarafından açıklanmıştı.

+1

Ayrıca, "b" karakterini bir nesnenin sınıfı olarak belirtirseniz "karakter" lerle de çalışabilirsiniz: "attributes (b) = list (class =" character "); rbind (b, b) ' –

1

rbind standart S3 işlevi değil, bu nedenle character için "kesiştiremezsiniz".

Neyse ki, varsayılan uygulamayı geçersiz kılabilirsiniz. Deneyin:

rbind.character <- function(...) { 

    print("hello from rbind.character") 
} 

rbind <- function(...) { 

    args <- list(...) 

    if (all(vapply(args, is.character, logical(1)))) { 

    rbind.character(...) 
    } else { 

    base::rbind(...) 
    } 
} 
Temel olarak, bağımsız değişkenlerin tüm karakterleri olup olmadığını kontrol ederiz. Eğer öyleyse, karakter fonksiyonumuzu çağırıyoruz. Değilse, varsayılan uygulamayı çağırıyoruz.