UseMethod("t")
memberitahu Anda bahwa itu t()
adalah fungsi generik ( S3 ) yang memiliki metode untuk kelas objek yang berbeda.
Sistem pengiriman metode S3
Untuk kelas S3, Anda dapat menggunakan methods
fungsi ini untuk membuat daftar metode untuk fungsi atau kelas generik tertentu.
> 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
"Fungsi yang tidak terlihat ditandai bintang" berarti fungsi tersebut tidak diekspor dari namespace paketnya. Anda masih dapat melihat kode sumbernya melalui :::
fungsi (yaitu stats:::t.ts
), atau dengan menggunakan getAnywhere()
. getAnywhere()
berguna karena Anda tidak perlu tahu dari paket mana fungsi itu berasal.
> 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>
Sistem pengiriman metode S4
Sistem S4 adalah sistem pengiriman metode yang lebih baru dan merupakan alternatif dari sistem S3. Berikut adalah contoh fungsi 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.
Outputnya sudah menawarkan banyak informasi. standardGeneric
adalah indikator fungsi S4. Metode untuk melihat metode S4 yang ditentukan ditawarkan dengan sangat membantu:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
dapat digunakan untuk melihat kode sumber dari salah satu metode:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Ada juga metode dengan tanda tangan yang lebih kompleks untuk setiap metode, misalnya
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"
Untuk melihat kode sumber untuk salah satu metode ini seluruh tanda tangan harus disediakan, mis
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Tidak cukup untuk memasok sebagian tanda tangan
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Fungsi yang memanggil fungsi yang tidak diekspor
Dalam kasus ts.union
, .cbindts
dan .makeNamesTs
merupakan fungsi yang tidak diekspor dari stats
namespace. Anda dapat melihat kode sumber fungsi yang tidak diekspor dengan menggunakan :::
operator atau 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>
Fungsi yang memanggil kode yang dikompilasi
Perhatikan bahwa "dikompilasi" tidak merujuk ke kode R byte-dikompilasi seperti yang dibuat oleh paket kompiler . The <bytecode: 0x294e410>
baris dalam output di atas menunjukkan bahwa fungsi ini byte-dikompilasi, dan Anda masih dapat melihat sumber dari baris perintah R.
Fungsi panggilan .C
, .Call
, .Fortran
, .External
, .Internal
, atau .Primitive
menelepon titik masuk dalam kode dikompilasi, sehingga Anda akan harus melihat sumber kode dikompilasi jika Anda ingin memahami fungsi. Ini cermin GitHub dari kode sumber R adalah tempat yang layak untuk memulai. Fungsi ini pryr::show_c_source
bisa menjadi alat yang berguna karena akan membawa Anda langsung ke halaman GitHub untuk .Internal
dan .Primitive
menelepon. Paket dapat menggunakan .C
, .Call
, .Fortran
, dan .External
; tetapi tidak .Internal
atau .Primitive
, karena ini digunakan untuk memanggil fungsi-fungsi yang dibangun ke dalam interpreter R.
Panggilan ke beberapa fungsi di atas dapat menggunakan objek, bukan string karakter untuk referensi fungsi yang dikompilasi. Dalam kasus tersebut, objek adalah kelas "NativeSymbolInfo"
, "RegisteredNativeSymbol"
atau "NativeSymbol"
; dan mencetak objek menghasilkan informasi yang bermanfaat. Misalnya, optim
panggilan .External2(C_optimhess, res$par, fn1, gr1, con)
(perhatikan itu C_optimhess
, bukan "C_optimhess"
). optim
ada dalam paket statistik, jadi Anda bisa mengetik stats:::C_optimhess
untuk melihat informasi tentang fungsi yang dikompilasi dipanggil.
Kode yang dikompilasi dalam sebuah paket
Jika Anda ingin melihat kode yang dikompilasi dalam sebuah paket, Anda perlu mengunduh / membongkar sumber paket. Binari yang diinstal tidak cukup. Kode sumber suatu paket tersedia dari repositori CRAN yang sama (atau yang kompatibel dengan CRAN) tempat asal paket tersebut. The download.packages()
Fungsi bisa mendapatkan sumber paket untuk Anda.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Ini akan mengunduh versi sumber paket Matrix dan menyimpan .tar.gz
file yang sesuai di direktori saat ini. Kode sumber untuk fungsi-fungsi yang dikompilasi dapat ditemukan di src
direktori file yang tidak dikompresi dan tidak dikompilasi. Langkah uncompressing dan unfaring dapat dilakukan di luar R
, atau dari dalam R
menggunakan untar()
fungsi. Dimungkinkan untuk menggabungkan langkah unduhan dan perluasan menjadi satu panggilan (perhatikan bahwa hanya satu paket pada satu waktu yang dapat diunduh dan dibuka dengan cara ini):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Atau, jika pengembangan paket di-host secara publik (misalnya melalui GitHub , R-Forge , atau RForge.net ), Anda mungkin dapat menelusuri kode sumber online.
Kode yang dikompilasi dalam paket dasar
Paket tertentu dianggap paket "basis". Paket-paket ini kapal dengan R dan versi mereka dikunci ke versi R. Contohnya termasuk base
, compiler
, stats
, dan utils
. Dengan demikian, mereka tidak tersedia sebagai paket yang dapat diunduh terpisah pada CRAN seperti dijelaskan di atas. Sebaliknya, mereka adalah bagian dari pohon sumber R dalam direktori paket individu di bawah /src/library/
. Cara mengakses sumber R dijelaskan di bagian selanjutnya.
Kode yang dikompilasi dibangun ke dalam interpreter R
Jika Anda ingin melihat kode bawaan ke interpreter R, Anda perlu mengunduh / membongkar sumber R; atau Anda dapat melihat sumber secara online melalui repositori R Subversion atau mirror github Winston Chang .
Artikel berita Uwe Ligges (PDF) (hlm. 43) adalah referensi umum yang baik tentang cara melihat kode sumber .Internal
dan .Primitive
fungsinya. Langkah-langkah dasar adalah pertama-tama mencari nama fungsi di src/main/names.c
dan kemudian mencari nama "entri-C" dalam file di src/main/*
.