2009-09-17 5 views
8

J'essaye d'écrire une fonction pour faire un travail particulier (dans mon cas, analyser un ensemble de données pour les valeurs aberrantes) donc les premières choses que je veux faire est de regarder comment d'autres personnes ont fait des travaux similaires.Comment examiner le code d'une fonction dans R qui est la classe d'objet sensible

Je peux le faire pour charger un paquet particulier et d'examiner le code d'une fonction, mais certaines fonctions semblent dépendre de ce que la classe d'objet que vous lancez

>library(outliers) 
> fix(outlier) 

function (x, opposite = FALSE, logical = FALSE) 
{ 
    if (is.matrix(x)) 
     apply(x, 2, outlier, opposite = opposite, logical = logical) 
    else if (is.data.frame(x)) 
     sapply(x, outlier, opposite = opposite, logical = logical) 
    else { 
     if (xor(((max(x) - mean(x)) < (mean(x) - min(x))), opposite)) { 
      if (!logical) 
       min(x) 
      else x == min(x) 
     } 
     else { 
      if (!logical) 
       max(x) 
      else x == max(x) 
     } 
    } 
} 

Comment pouvez-vous regarder le code de quelque chose qui change en fonction de l'objet?

Edit:

OK, Palm < - visage. La fonction que j'ai utilisée comme exemple s'appelle elle-même, mais tout le code est là ... J'ai vu d'autres exemples (mais je ne peux penser à rien) où la fonction a fait d'autres choses en fonction de la classe de l'objet à cela, donc la question est là, même si c'est un mauvais exemple!

Répondre

7

Quand vous dites

la fonction a fait faire d'autres choses en fonction de la classe de l'objet jeté à elle

vous êtes déjà au cœur du mécanisme d'expédition S3! Donc Je recommanderais de lire un livre de programmation sur R comme p. Ex.

  • (classique mais daté) Venables/Ripley "S Programmation",
  • Gentleman "bio-informatique avec R",
  • Brown/Murdoch "Premier cours en programmation statistique avec R",
  • Chambers " Logiciel pour l'analyse de données: Programmation avec R ",

ou d'autres ressources de this SO question on R books avec un exemple de package ou deux de l'ensemble riche de packages CRAN.

4

Par exemple, plot() fera différentes choses en fonction de l'objet. Vous pouvez voir les fonctions de tracé spécifiques (appelées méthodes) en utilisant plot.ts(), plot.lm(), etc., c'est-à-dire que plot() appellera plot.ts() si un objet ts est passé. En général, plot.xxx() est appliqué aux objets de la classe xxx. S'il n'y a pas de méthode spécifique pour la classe, alors plot.default() est utilisé.

La fonction plot() est appelée une fonction générique car elle peut s'appliquer à de nombreuses classes différentes. Les autres fonctions génériques courantes sont summary(), print() et predict(). Comme le dit Dirk, il vaut la peine de lire la documentation sur les méthodes et les classes S3.

+2

Et, dans le cas où vous êtes curieux, vous pouvez accéder à toutes les méthodes de l'une de ces fonctions en entrant simplement des méthodes (functionname). Essayez des méthodes (impression), par exemple, si vous voulez avoir votre esprit soufflé. –

28

Mon processus de réflexion pour trouver le code de fonction tend à être:

D'abord, tapez le nom de la fonction

Cas 1: Il montre le code

Grand, vous avez terminé.

Exemple: diag

Cas n ° 2: La fonction est comme une déclaration UseMethod une ligne

Vous avez une méthode S3. Type methods(fnname) pour voir les méthodes disponibles, puis getAnywhere(fnname.myclass).

Exemple: moyenne

methods(mean) 
getAnywhere(mean.default) 
Cas n ° 3: La fonction contient une déclaration .Internal ou .Primitive

La fonction est écrit en C, pour améliorer les performances. Téléchargez une copie du code source R et extrayez l'archive tar. Recherchez dans le répertoire src le nom de la fonction.

EDIT: Vous pouvez également rechercher le fichier en utilisant la recherche de site Google ou Yahoo.

site:https://svn.r-project.org/R/trunk/src functionname 

Fin EDIT

Exemple: qnorm

Une fenêtre recherche simple pour "qnorm" dans le répertoire src du code source R révèle le fichier qnorm.c, qui contient la fonction définition.

EDIT: qnorm.c est également le meilleur résultat de la recherche

site:https://svn.r-project.org/R/trunk/src qnorm 

Fin EDIT

Cas n ° 4: Vous ne trouvez pas la fonction

Il est probablement méthode d'une classe S4.

Tapez class(myobj) pour trouver la classe.

Pour connaître les méthodes disponibles pour cette classe, tapez showMethods(class="myclass").

Type getMethods("fnname", "myclass").

Exemple: terrain pixmap

Cela nécessite le paquet pixmap.

library(pixmap) 
pixie <- pixmap(1:12, nrow=3, ncol=4) 
class(pixie) #"pixmap" 
showMethods(class="pixmap") 
getMethod("plot", "pixmap") 
+0

Super réponse! – MaHo

0

Pour un autre cas ne sont pas couverts dans les réponses voir ici les réponses rapportées dans « view source code in R »

qui traite du cas des fonctions qui apparaissent comme « non visible » lors de l'exécution des méthodes (fonction .I.am.looking.for)

En bref, vous pouvez ensuite utiliser une commande de la forme: package ::: function.class pour voir le code que vous voulez.

0

J'ai récemment trébuché sur le CRAN Meta repository on GitHub, qui contient essentiellement une version en lecture seule de tous les paquets dans le dépôt CRAN.Vous pouvez effectuer une recherche par nom de package, après avoir sélectionné le package que vous êtes après il y a un dossier appelé R au sein, qui abrite le code source dans R.

Par exemple, je recherchais le paquet mboost, cliquée sur le dans et entré le dossier R, qui montre ce list of code.

Je n'ai pas encore eu de cas où je n'ai pas trouvé ce que je recherchais. Je n'ai pas non plus jusqu'à voir si TOUS code C/C++ sous-jacent est montré ou lié, mais c'était pour l'exemple mboost ci-dessus. Le code-c était dans un autre dossier de premier niveau nommé src