UseMethod("t")
sagt Ihnen, dass t()
es sich um eine ( S3 ) generische Funktion handelt, die Methoden für verschiedene Objektklassen enthält.
Das Versandverfahren nach der S3-Methode
Für S3-Klassen können Sie die methods
Funktion verwenden, um die Methoden für eine bestimmte generische Funktion oder Klasse aufzulisten.
> 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
"Nicht sichtbare Funktionen sind mit einem Sternchen versehen" bedeutet, dass die Funktion nicht aus dem Namespace ihres Pakets exportiert wird. Sie können den Quellcode weiterhin über die :::
Funktion (dh stats:::t.ts
) oder mithilfe von anzeigen getAnywhere()
. getAnywhere()
ist nützlich, weil Sie nicht wissen müssen, von welchem Paket die Funktion stammt.
> 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>
Das S4-Methodenversandsystem
Das S4-System ist ein neueres Methodenversandsystem und eine Alternative zum S3-System. Hier ist ein Beispiel für eine S4-Funktion:
> 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.
Die Ausgabe bietet bereits viele Informationen. standardGeneric
ist ein Indikator für eine S4-Funktion. Die Methode zum Anzeigen definierter S4-Methoden wird hilfreich angeboten:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
kann verwendet werden, um den Quellcode einer der folgenden Methoden anzuzeigen:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Es gibt beispielsweise auch Methoden mit komplexeren Signaturen für jede Methode
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"
Um den Quellcode für eine dieser Methoden anzuzeigen, muss die gesamte Signatur bereitgestellt werden, z
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Es reicht nicht aus, die Teilunterschrift zu liefern
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Funktionen, die nicht exportierte Funktionen aufrufen
Im Fall von ts.union
, .cbindts
und .makeNamesTs
sind unexported Funktionen aus dem stats
Namespace. Sie können den Quellcode nicht exportierter Funktionen mit dem :::
Operator oder anzeigen 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>
Funktionen, die kompilierten Code aufrufen
Beachten Sie, dass "kompiliert" nicht auf bytekompilierten R-Code verweist, wie er vom Compilerpaket erstellt wurde. Die <bytecode: 0x294e410>
Zeile in der obigen Ausgabe zeigt an, dass die Funktion bytekompiliert ist und Sie die Quelle weiterhin über die R-Befehlszeile anzeigen können.
Funktionen dieser Anruf .C
, .Call
, .Fortran
, .External
, .Internal
, oder .Primitive
Einstiegspunkte in kompilierten Code aufrufen, so dass Sie auf Quellen des kompilierten Codes suchen müssen, wenn Sie die Funktion vollständig verstehen wollen. Dieser GitHub-Spiegel des R-Quellcodes ist ein guter Ausgangspunkt. Die Funktion pryr::show_c_source
kann ein nützliches Werkzeug sein, da sie Sie direkt zu einer GitHub-Seite für .Internal
und .Primitive
Aufrufen führt. Pakete können verwendet werden .C
, .Call
, .Fortran
und .External
; aber nicht .Internal
oder .Primitive
, weil diese verwendet werden, um Funktionen aufzurufen, die in den R-Interpreter eingebaut sind.
Aufrufe einiger der oben genannten Funktionen können ein Objekt anstelle einer Zeichenfolge verwenden, um auf die kompilierte Funktion zu verweisen. In diesen Fällen ist das Objekt der Klasse "NativeSymbolInfo"
, "RegisteredNativeSymbol"
oder "NativeSymbol"
; und das Drucken des Objekts liefert nützliche Informationen. Zum Beispiel optim
Anrufe .External2(C_optimhess, res$par, fn1, gr1, con)
(beachten Sie, dass dies nicht der C_optimhess
Fall ist "C_optimhess"
). optim
befindet sich im Statistikpaket, sodass Sie eingeben können stats:::C_optimhess
, um Informationen zur aufgerufenen kompilierten Funktion anzuzeigen.
Kompilierter Code in einem Paket
Wenn Sie kompilierten Code in einem Paket anzeigen möchten, müssen Sie die Paketquelle herunterladen / entpacken. Die installierten Binärdateien reichen nicht aus. Der Quellcode eines Pakets ist im selben CRAN-Repository (oder CRAN-kompatiblen Repository) verfügbar, aus dem das Paket ursprünglich installiert wurde. Die download.packages()
Funktion kann die Paketquelle für Sie abrufen.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Dadurch wird die Quellversion des Matrix-Pakets heruntergeladen und die entsprechende .tar.gz
Datei im aktuellen Verzeichnis gespeichert. Der Quellcode für kompilierte Funktionen befindet sich im src
Verzeichnis der unkomprimierten und nicht tarierten Datei. Der Dekomprimierungs- und Entpackungsschritt kann außerhalb R
oder von innen R
mithilfe der untar()
Funktion ausgeführt werden. Es ist möglich, den Download- und Erweiterungsschritt in einem einzigen Aufruf zu kombinieren (beachten Sie, dass auf diese Weise jeweils nur ein Paket heruntergeladen und entpackt werden kann):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Wenn die Paketentwicklung öffentlich gehostet wird (z. B. über GitHub , R-Forge oder RForge.net ), können Sie den Quellcode wahrscheinlich auch online durchsuchen.
Kompilierter Code in einem Basispaket
Bestimmte Pakete gelten als "Basis" -Pakete. Diese Pakete versenden mit R und deren Version auf die Version von R. Beispiele gesperrt sind base
, compiler
, stats
, und utils
. Daher sind sie nicht wie oben beschrieben als separate herunterladbare Pakete auf CRAN verfügbar. Sie sind vielmehr Teil des R-Quellbaums in einzelnen Paketverzeichnissen unter /src/library/
. Der Zugriff auf die R-Quelle wird im nächsten Abschnitt beschrieben.
In den R-Interpreter integrierter kompilierter Code
Wenn Sie den im R-Interpreter integrierten Code anzeigen möchten, müssen Sie die R-Quellen herunterladen / entpacken. Oder Sie können die Quellen online über das R Subversion-Repository oder den Github-Spiegel von Winston Chang anzeigen .
Der R-Nachrichtenartikel (PDF) von Uwe Ligges (S. 43) ist eine gute allgemeine Referenz zum Anzeigen des Quellcodes .Internal
und der .Primitive
Funktionen. Die grundlegenden Schritte bestehen darin, zuerst nach dem Funktionsnamen in zu src/main/names.c
suchen und dann in den Dateien in nach dem Namen "C-Eintrag" zu suchen src/main/*
.