UseMethod("t")
vous indique qu'il t()
s'agit d'une fonction générique ( S3 ) qui a des méthodes pour différentes classes d'objets.
Le système de répartition de la méthode S3
Pour les classes S3, vous pouvez utiliser la methods
fonction pour répertorier les méthodes d'une fonction ou classe générique particulière.
> methods(t)
[1] t.data.frame t.default t.ts*
Non-visible functions are asterisked
> methods(class="ts")
[1] aggregate.ts as.data.frame.ts cbind.ts* cycle.ts*
[5] diffinv.ts* diff.ts kernapply.ts* lines.ts
[9] monthplot.ts* na.omit.ts* Ops.ts* plot.ts
[13] print.ts time.ts* [<-.ts* [.ts*
[17] t.ts* window<-.ts* window.ts*
Non-visible functions are asterisked
"Les fonctions non visibles sont marquées d'un astérisque" signifie que la fonction n'est pas exportée depuis l'espace de noms de son package. Vous pouvez toujours voir son code source via la :::
fonction (ie stats:::t.ts
), ou en utilisant getAnywhere()
. getAnywhere()
est utile car vous n'avez pas besoin de savoir de quel paquet provient la fonction.
> getAnywhere(t.ts)
A single object matching ‘t.ts’ was found
It was found in the following places
registered S3 method for t from namespace stats
namespace:stats
with value
function (x)
{
cl <- oldClass(x)
other <- !(cl %in% c("ts", "mts"))
class(x) <- if (any(other))
cl[other]
attr(x, "tsp") <- NULL
t(x)
}
<bytecode: 0x294e410>
<environment: namespace:stats>
Le système de répartition de la méthode S4
Le système S4 est un nouveau système de répartition des méthodes et une alternative au système S3. Voici un exemple de fonction S4:
> library(Matrix)
Loading required package: lattice
> chol2inv
standardGeneric for "chol2inv" defined from package "base"
function (x, ...)
standardGeneric("chol2inv")
<bytecode: 0x000000000eafd790>
<environment: 0x000000000eb06f10>
Methods may be defined for arguments: x
Use showMethods("chol2inv") for currently available ones.
La sortie offre déjà beaucoup d'informations. standardGeneric
est un indicateur d'une fonction S4. La méthode pour voir les méthodes S4 définies est offerte utilement:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
peut être utilisé pour voir le code source de l'une des méthodes:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Il existe également des méthodes avec des signatures plus complexes pour chaque méthode, par exemple
require(raster)
showMethods(extract)
Function: extract (package raster)
x="Raster", y="data.frame"
x="Raster", y="Extent"
x="Raster", y="matrix"
x="Raster", y="SpatialLines"
x="Raster", y="SpatialPoints"
x="Raster", y="SpatialPolygons"
x="Raster", y="vector"
Pour voir le code source de l'une de ces méthodes, la signature entière doit être fournie, par exemple
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Il ne suffira pas de fournir la signature partielle
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Fonctions qui appellent des fonctions non exportées
Dans le cas de ts.union
, .cbindts
et .makeNamesTs
sont des fonctions non exportées de l' stats
espace de noms. Vous pouvez afficher le code source des fonctions non exportées à l'aide de l' :::
opérateur ou getAnywhere
.
> stats:::.makeNamesTs
function (...)
{
l <- as.list(substitute(list(...)))[-1L]
nm <- names(l)
fixup <- if (is.null(nm))
seq_along(l)
else nm == ""
dep <- sapply(l[fixup], function(x) deparse(x)[1L])
if (is.null(nm))
return(dep)
if (any(fixup))
nm[fixup] <- dep
nm
}
<bytecode: 0x38140d0>
<environment: namespace:stats>
Fonctions qui appellent du code compilé
Notez que "compilé" ne fait pas référence au code R compilé en octets tel que créé par le package du compilateur . La <bytecode: 0x294e410>
ligne dans la sortie ci-dessus indique que la fonction est compilée en octets, et vous pouvez toujours afficher la source à partir de la ligne de commande R.
Fonctions appel .C
, .Call
, .Fortran
, .External
, .Internal
ou .Primitive
appellent des points d'entrée dans le code compilé, de sorte que vous devrez regarder les sources du code compilé si vous voulez comprendre la fonction. Ce miroir GitHub du code source R est un bon endroit pour commencer. La fonction pryr::show_c_source
peut être un outil utile car elle vous mènera directement à une page GitHub pour .Internal
et .Primitive
appels. Les packages peuvent utiliser .C
,.Call
, .Fortran
et .External
; mais pas .Internal
ou .Primitive
, car ceux-ci sont utilisés pour appeler des fonctions intégrées à l'interpréteur R.
Les appels à certaines des fonctions ci-dessus peuvent utiliser un objet au lieu d'une chaîne de caractères pour référencer la fonction compilée. Dans ces cas, l'objet est de classe "NativeSymbolInfo"
, "RegisteredNativeSymbol"
ou "NativeSymbol"
; et l'impression de l'objet fournit des informations utiles. Par exemple, les optim
appels .External2(C_optimhess, res$par, fn1, gr1, con)
(notez queC_optimhess
pas le cas "C_optimhess"
). optim
est dans le package de statistiques, vous pouvez donc taper stats:::C_optimhess
pour voir les informations sur la fonction compilée appelée.
Code compilé dans un package
Si vous souhaitez afficher le code compilé dans un package, vous devrez télécharger / décompresser la source du package. Les binaires installés ne sont pas suffisants. Le code source d'un package est disponible à partir du même référentiel CRAN (ou compatible CRAN) à partir duquel le package a été initialement installé. ledownload.packages()
fonction peut obtenir la source du package pour vous.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Cela va télécharger la version source du package Matrix et enregistrer le .tar.gz
fichier correspondant dans le répertoire actuel. Le code source des fonctions compilées se trouve dans le src
répertoire du fichier non compressé et non taré. L'étape de décompression et de décompression peut être effectuée à l'extérieur R
ou à l'intérieur de R
la untar()
fonction. Il est possible de combiner l'étape de téléchargement et d'extension en un seul appel (notez qu'un seul package à la fois peut être téléchargé et décompressé de cette manière):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Alternativement, si le développement du package est hébergé publiquement (par exemple via GitHub , R-Forge ou RForge.net ), vous pouvez probablement parcourir le code source en ligne.
Code compilé dans un package de base
Certains packages sont considérés comme des packages «de base». Ces paquets sont livrés avec R et leur version est verrouillé à la version des exemples R. comprennent base
, compiler
, stats
et utils
. En tant que tels, ils ne sont pas disponibles en tant que packages téléchargeables séparés sur CRAN comme décrit ci-dessus. Ils font plutôt partie de l'arborescence source R dans les répertoires de packages individuels sous /src/library/
. Comment accéder à la source R est décrit dans la section suivante.
Code compilé intégré à l'interpréteur R
Si vous souhaitez afficher le code intégré à l'interpréteur R, vous devrez télécharger / décompresser les sources R; ou vous pouvez afficher les sources en ligne via le référentiel R Subversion ou le miroir github de Winston Chang .
L' article de presse R d' Uwe Ligges (PDF) (p. 43) est une bonne référence générale sur la façon d'afficher le code source .Internal
et les .Primitive
fonctions. Les étapes de base consistent à rechercher d'abord le nom de la fonction dans src/main/names.c
, puis à rechercher le nom "C-entry" dans les fichiers de src/main/*
.