2012-01-01 14 views
43

Dato un oggetto R arbitrario, come posso ottenere tutti i metodi associati all'oggetto?Trova metodi Oggetto R

+2

In R, metodi sono associati a funzioni, non oggetti. Prima capirai che i sistemi OO di R più presto inizieranno a dare un senso. – hadley

+0

Se su google "trova metodi r", i primi due risultati ti portano ai file della pagina della guida appropriati. : P –

+0

@hadley ma non tutti gli oggetti funzione? –

risposta

48

Il più vicino a cui riesco a pensare è methods (se oggetto/funzione S3, List all available methods for an S3 generic function, or all methods for a class.) o showMethods (se S4).

es .:

> 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 

O per una funzione:

> 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 può anche rivelarsi un utile di lettura.

12

La classe di un oggetto R viene ripristinata con class. Gli oggetti non hanno metodi associati con loro nel linguaggio tipico di R. La classe di un oggetto determina quali metodi di funzione verranno applicati ad esso. Per determinare quali funzioni hanno i metodi associati a una determinata classe, è necessario testare tutte le funzioni disponibili per verificare se esistesse un metodo specifico della classe. Anche in questo caso le funzioni generiche tenterebbero di utilizzare un metodo "predefinito" nella maggior parte dei casi.

Alcuni metodi associati a una funzione generica S3 vengono visualizzati con methods. I metodi di una funzione S4 vengono ripristinati con showMethods. Quindi, per quello che la maggior parte delle persone chiamerebbe "oggetti", la tua domanda non ha senso, ma se capitasse di includere funzioni sotto il termine generale "oggetti" (che è tecnicamente corretto), allora ho risposto.

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

Poi ci sono un gruppo di metodi che si potrebbe chiamare "implicito", anche se il loro nome 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 

E anche allora non si è realmente visualizzare i membri della matematica o la famiglia Ops, ma li avresti visti nella pagina di aiuto per? groupGeneric. Non vedi Ops.numeric. Una vista di livello inferiore è fornita da:

Questi generano un errore se viene offerto l'argomento di classe errato.

1

Alcuni pacchetti definiscono funzioni che non sono metodi ma che sono tuttavia destinati all'uso con una particolare classe. Ad esempio, la libreria (igraph) definisce la funzione radius(_), che è destinata all'uso su oggetti nella classe igraph. Poiché tali funzioni non sono metodi, methods(_) e showMethods(_) non le visualizzeranno.

In tali casi, lsf.str(_) può essere molto utile. Ad esempio:

lsf.str("package:igraph") 

comprende la linea:

radius : function (graph, mode = c("all", "out", "in", "total"))