UseMethod("t")
mówi ci, że t()
jest to ogólna funkcja ( S3 ), która ma metody dla różnych klas obiektów.
System wysyłki metodą S3
W przypadku klas S3 można użyć methods
funkcji, aby wyświetlić listę metod dla określonej funkcji ogólnej lub klasy.
> 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
„Niewidoczne funkcje są oznaczone gwiazdką” oznacza, że funkcja nie jest eksportowana z przestrzeni nazw swojego pakietu. Nadal możesz przeglądać jego kod źródłowy za pomocą :::
funkcji (tj. stats:::t.ts
) Lub za pomocą getAnywhere()
. getAnywhere()
jest przydatne, ponieważ nie musisz wiedzieć, z którego pakietu pochodzi ta funkcja.
> 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>
System wysyłki metody S4
System S4 to nowszy system dyspozytorski i stanowi alternatywę dla systemu S3. Oto przykład funkcji 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.
Dane wyjściowe już oferują wiele informacji. standardGeneric
jest wskaźnikiem funkcji S4. Pomocna jest metoda wyświetlania zdefiniowanych metod S4:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
można użyć do wyświetlenia kodu źródłowego jednej z metod:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Istnieją również metody z bardziej złożonymi podpisami dla każdej metody, na przykład
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"
Aby zobaczyć kod źródłowy jednej z tych metod, należy podać cały podpis, np
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Podanie częściowego podpisu nie wystarczy
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Funkcje wywołujące funkcje nieobsługiwane
W przypadku ts.union
, .cbindts
i .makeNamesTs
są unexported funkcje z stats
przestrzeni nazw. Możesz wyświetlić kod źródłowy niewyportowanych funkcji za pomocą :::
operatora lub 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>
Funkcje wywołujące skompilowany kod
Zauważ, że „skompilowany” nie odnosi się do skompilowanego bajtowo kodu R utworzonego przez pakiet kompilatora . <bytecode: 0x294e410>
Linia w powyższym wyjściu wskazuje, że funkcja jest bajt skompilowany, i nadal można zobaczyć źródło z linii poleceń R.
Funkcje połączeń .C
, .Call
, .Fortran
, .External
, .Internal
, lub .Primitive
dzwonisz punkty wejścia w skompilowanego kodu, więc trzeba będzie spojrzeć na źródła skompilowanego kodu, jeśli chcesz, aby w pełni zrozumieć tę funkcję. To lustro GitHub kodu źródłowego R jest przyzwoitym miejscem do rozpoczęcia. Ta funkcja pryr::show_c_source
może być przydatnym narzędziem, ponieważ zabierze Cię bezpośrednio do strony GitHub .Internal
i .Primitive
wywołań. Pakiety mogą korzystać .C
, .Call
, .Fortran
, i .External
; ale nie .Internal
lub .Primitive
, ponieważ są one używane do wywoływania funkcji wbudowanych w interpreter R.
Wywołania niektórych z powyższych funkcji mogą wykorzystywać obiekt zamiast ciągu znaków w celu odniesienia do skompilowanej funkcji. W tych przypadkach, obiekt jest klasy "NativeSymbolInfo"
, "RegisteredNativeSymbol"
lub "NativeSymbol"
; a wydrukowanie obiektu dostarcza użytecznych informacji. Na przykład optim
połączenia .External2(C_optimhess, res$par, fn1, gr1, con)
(uwaga, że C_optimhess
nie "C_optimhess"
). optim
znajduje się w pakiecie statystyk, więc możesz wpisać, stats:::C_optimhess
aby wyświetlić informacje o wywołanej kompilowanej funkcji.
Skompilowany kod w pakiecie
Jeśli chcesz wyświetlić skompilowany kod w pakiecie, musisz pobrać / rozpakować źródło pakietu. Zainstalowane pliki binarne nie są wystarczające. Kod źródłowy pakietu jest dostępny z tego samego repozytorium CRAN (lub zgodnego z CRAN), z którego pakiet został pierwotnie zainstalowany. download.packages()
Funkcja może dostać źródła pakietów dla Ciebie.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Spowoduje to pobranie źródłowej wersji pakietu Matrix i zapisanie odpowiedniego .tar.gz
pliku w bieżącym katalogu. Kod źródłowy skompilowanych funkcji można znaleźć w src
katalogu nieskompresowanego i nieopartego pliku. Etap rozpakowywania i odznaczania można wykonać poza funkcją R
lub od wewnątrz R
za pomocą tej untar()
funkcji. Możliwe jest połączenie kroku pobierania i rozszerzenia w jedno wywołanie (pamiętaj, że tylko jeden pakiet na raz można pobrać i rozpakować w ten sposób):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Alternatywnie, jeśli tworzenie pakietu jest hostowane publicznie (np. Przez GitHub , R-Forge lub RForge.net ), prawdopodobnie możesz przeglądać kod źródłowy online.
Skompilowany kod w pakiecie podstawowym
Niektóre pakiety są uważane za pakiety „podstawowe”. Te pakiety dostarczane z R i ich wersja jest zablokowane do wersji R. Przykłady obejmują base
, compiler
, stats
, i utils
. Jako takie nie są dostępne jako osobne pakiety do pobrania w CRAN, jak opisano powyżej. Są raczej częścią drzewa źródłowego R w poszczególnych katalogach pakietów w /src/library/
. Sposób uzyskania dostępu do źródła R opisano w następnej sekcji.
Skompilowany kod wbudowany w interpreter R.
Jeśli chcesz wyświetlić kod wbudowany w interpreter R, musisz pobrać / rozpakować źródła R; lub możesz przeglądać źródła online za pośrednictwem repozytorium R Subversion lub lustra github Winstona Changa .
Artykuł informacyjny R Uwe Liggesa (PDF) (s. 43) stanowi dobre ogólne odniesienie do tego, jak wyświetlić kod źródłowy .Internal
i .Primitive
funkcje. Podstawowe kroki to najpierw poszukać nazwy funkcji w, src/main/names.c
a następnie poszukać nazwy „C-entry” w plikach w src/main/*
.