2012-01-01 10 views
43

Jak uzyskać dowolny obiekt R, jak uzyskać wszystkie metody powiązane z obiektem?Metody obiektowe R

+2

W R metod związanych z funkcjami, a nie obiektów. Im szybciej zdasz sobie sprawę, że wcześniej systemy OO R zaczną mieć sens. – hadley

+0

Jeśli wyszukasz w Google "metody r", pierwsze dwa trafienia prowadzą do odpowiednich plików stron pomocy. : P –

+0

@hadley, ale czy nie wszystkie obiekty funkcji? –

Odpowiedz

48

Najbliższym, o czym mogę pomyśleć, jest methods (jeśli obiekt/funkcja S3, List all available methods for an S3 generic function, or all methods for a class.) lub showMethods (jeśli S4).

np .:

> A <- matrix(runif(10)) 
> B <- methods(class=class(A)) 
> B 
[1] anyDuplicated.matrix as.data.frame.matrix as.raster.matrix* 
[4] boxplot.matrix  determinant.matrix duplicated.matrix 
[7] edit.matrix*   head.matrix   isSymmetric.matrix 
[10] relist.matrix*  subset.matrix  summary.matrix  
[13] tail.matrix   unique.matrix  

    Non-visible functions are asterisked 
> attr(B,'info') 
        visible    from 
anyDuplicated.matrix TRUE  package:base 
as.data.frame.matrix TRUE  package:base 
as.raster.matrix  FALSE registered S3method 
boxplot.matrix   TRUE package:graphics 
determinant.matrix  TRUE  package:base 
duplicated.matrix  TRUE  package:base 
edit.matrix   FALSE registered S3method 
head.matrix    TRUE  package:utils 
isSymmetric.matrix  TRUE  package:base 
relist.matrix   FALSE registered S3method 
subset.matrix   TRUE  package:base 
summary.matrix   TRUE  package:base 
tail.matrix    TRUE  package:utils 
unique.matrix   TRUE  package:base 

Albo dla funkcji:

> methods(summary) 
[1] summary.aov    summary.aovlist   summary.aspell*   
[4] summary.connection  summary.data.frame  summary.Date   
[7] summary.default   summary.ecdf*   summary.factor   
[10] summary.glm    summary.infl   summary.lm    
[13] summary.loess*   summary.manova   summary.matrix   
[16] summary.mlm    summary.nls*   summary.packageStatus* 
[19] summary.PDF_Dictionary* summary.PDF_Stream*  summary.POSIXct   
[22] summary.POSIXlt   summary.ppr*   summary.prcomp*   
[25] summary.princomp*  summary.srcfile   summary.srcref   
[28] summary.stepfun   summary.stl*   summary.table   
[31] summary.tukeysmooth* 

    Non-visible functions are asterisked 

?Methods mogą również okazać się przydatny do odczytu.

12

Klasa obiektu R jest odzyskiwana z class. Obiekty nie mają powiązanych z nimi metod w typowym języku R. Klasa obiektu określa, jakie funkcje-metody zostaną do niego zastosowane. Aby ustalić, jakie funkcje mają metody powiązane z daną klasą, należy przetestować wszystkie dostępne funkcje, aby sprawdzić, czy istnieje metoda specyficzna dla klasy. Nawet wtedy funkcje generyczne próbowałyby użyć metody "domyślnej" w większości przypadków.

Niektóre metody związane z ogólną funkcją S3 są wyświetlane z methods. Metody funkcji S4 są odzyskiwane za pomocą showMethods. Tak więc, dla większości ludzi, którzy nazywają to "obiektami", twoje pytanie nie ma sensu, ale jeśli zdarzyło się, że włączasz funkcje pod ogólnym terminem "przedmioty" (co jest technicznie sprawiedliwe), odpowiedziałem.

showMethods(classes="data.frame") 
methods(class="data.frame") 

Wtedy to grupa metod, które można nazwać „ukryte”, choć ich nazwa R „groupGeneric”

?groupGeneric 

methods("Math") # These are "add-on" methods to the primitive Math functions 
[1] Math.data.frame Math.Date  Math.dates*  Math.difftime Math.factor  
[6] Math.mChoice  Math.polynomial* Math.POSIXt  Math.ratetable* Math.Surv*  
[11] Math.times*  

    Non-visible functions are asterisked 
?"+" 

methods("Ops") # The binary operators such as "+", "-", "/" 
[1] Ops.data.frame  Ops.Date   Ops.dates*   Ops.difftime  Ops.factor   
[6] Ops.findFn   Ops.mChoice   Ops.numeric_version Ops.ordered   Ops.polynomial*  
[11] Ops.POSIXt   Ops.raster*   Ops.ratetable*  Ops.Surv*   Ops.times*   
[16] Ops.ts*    Ops.unit*   Ops.yearmon*  Ops.yearqtr*  Ops.zoo*   

    Non-visible functions are asterisked 

I nawet wtedy nie mają naprawdę wyświetlać członków Math lub rodzina Ops, ale widziałbyś je na stronie pomocy dla? groupGeneric. Nie widzisz Ops.numeric. Nieco niższy poziom widoku zapewnia:

.Primitive("+") 
# function (e1, e2) .Primitive("+") 

Spowoduje to zgłoszenie błędu, jeśli zostanie podany niewłaściwy argument.

1

Niektóre pakiety definiują funkcje, które nie są metodami, ale mimo to są przeznaczone do użytku z określoną klasą. Na przykład biblioteka (igraph) definiuje funkcję radius(_), która jest przeznaczona do użytku na obiektach klasy igraph. Ponieważ takie funkcje nie są metodami, nie będą ich ujawniać. W takich przypadkach bardzo pomocne może być lsf.str(_). Np

lsf.str("package:igraph") 

zawiera linię:

radius : function (graph, mode = c("all", "out", "in", "total")) 
Powiązane problemy