2009-11-23 4 views
4

Je voudrais savoir comment trouver rapidement la fonction spécifique appelée par une fonction générique pour un objet spécifique. Exemple:Déterminer quelle fonction est appelée par une fonction générique

library(spatial) 
data(redwood) 
K <- Kest(redwood) 
plot(K) 

Ce n'est pas un complot d'habitude, il est une construction de parcelle pour un objet Kest(). Donc, pour enquêter afin de trouver la fonction utilisée, je fais:

class(K) 

Je reçois

"fv" "data.frame"

Je suppose que c'est plot.fv

?plot.fv 

Yey! Mais je suis sûr qu'il y a un moyen plus efficace que de deviner. N'importe qui ?

Répondre

3

Vous pouvez trouver toutes les fonctions génériques correspondantes pour une classe S3 en utilisant des méthodes(). Donc dans votre cas:

methods(class=fv) 
+0

@eytan: La fonction 'methods' est en fait dans le paquet' utils', pas dans le paquetage methods. –

+0

La réponse de Marek est vraiment ce que je cherchais, mais j'aime la simplicité et l'élégance de votre proposition, même si cela nécessite un travail manuel. –

1

Il est clair décrit dans l'aide à UseMethod.

Lorsqu'une fonction d'appel UseMethod("fun") est appliquée à un objet avec attribut class c("first", "second"), le système recherche pour une fonction appelée fun.first et, si elle le trouve, l'applique à l'objet. Si aucune fonction n'est trouvée, une fonction appelée fun.second est essayée. Si aucun nom de classe ne produit une fonction appropriée, la fonction fun.default est utilisée, si elle existe, ou une erreur se produit.

Donc, si vous cherchez le bon fonctionnement, vous devez vérifier tous les posibilités, par exemple .:

fun_seeker <- function(obj,fun) { 
    funs_to_check <- paste(fun,c(class(obj),"default"),sep=".") 
    funs_exists <- funs_to_check %in% methods(fun) 
    if (any(funs_exists)) funs_to_check[funs_exists][1] else stop("No applicable method") 
} 
fun_seeker(matrix(rnorm(100),10),"plot") 
fun_seeker(matrix(rnorm(100),10),"summary") 
0

Dans ce cas, nous avons affaire à une classe S3. (Ceci est le plus ancien, objet plus simple style orienté.) Cela signifie que lorsque vous tapez plot(K) pour un objet à la classe "fv" "data.frame", R effectue les opérations suivantes:

Il regarde à travers le chemin de recherche pour trouver une fonction nommée plot. Tapez search() pour voir où R ressemble. En supposant que vous n'avez pas fait quelque chose de stupide comme définir votre propre fonction de tracé, il devrait trouver la version dans le paquet graphics.

Cette fonction a une logique spéciale pour traiter une entrée où x est une fonction, puis appelle UseMethod.

UseMethod recherche le chemin d'accès à une fonction nommée plot.fv et l'appelle s'il le trouve.

A défaut, il recherche plot.data.frame.

A défaut, il recherche plot.default.

Si cela n'a pas pu être trouvé, une erreur aurait été générée.(Bien que plot.default existe dans le package graphique, vous devrez essayer d'obtenir une erreur ici.)

Questions connexes