UseMethod("t")
size farklı nesne sınıfları için yöntemler t()
içeren ( S3 ) genel bir işlev olduğunu söylüyor .
S3 yöntemi sevk sistemi
S3 sınıfları için, methods
işlevi, belirli bir genel işlev veya sınıf için yöntemleri listelemek üzere kullanabilirsiniz .
> 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
"Görünmeyen işlevler yıldız işaretlidir", işlevin paketinin ad alanından dışa aktarılmadığı anlamına gelir. Kaynak kodunu :::
işlev (örn. stats:::t.ts
) Üzerinden veya düğmesini kullanarak görüntüleyebilirsiniz getAnywhere()
. getAnywhere()
yararlıdır çünkü işlevin hangi paketten geldiğini bilmek zorunda değilsiniz.
> 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>
S4 yöntemi sevk sistemi
S4 sistemi daha yeni bir yöntem dağıtım sistemidir ve S3 sistemine bir alternatiftir. İşte bir S4 işlevi örneği:
> 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.
Çıktı zaten çok fazla bilgi sunuyor. standardGeneric
bir S4 fonksiyonunun göstergesidir. Tanımlanmış S4 yöntemlerini görme yöntemi faydalı bir şekilde sunulmaktadır:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
yöntemlerden birinin kaynak kodunu görmek için kullanılabilir:
> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...)
{
chk.s(...)
tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
x
target "diagonalMatrix"
defined "diagonalMatrix"
Ayrıca, her yöntem için daha karmaşık imzalara sahip yöntemler de vardır, örneğin
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"
Bu yöntemlerden birinin kaynak kodunu görmek için imzanın tamamı sağlanmalıdır, örn.
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Kısmi imza sağlamak yeterli olmayacaktır
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Dışa aktarılmamış işlevleri çağıran işlevler
Durumunda ts.union
, .cbindts
ve .makeNamesTs
gelen unexported fonksiyonlardır stats
ad. :::
Operatörü veya kullanarak dışa aktarılmayan fonksiyonların kaynak kodunu görüntüleyebilirsiniz 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>
Derlenmiş kodu çağıran işlevler
"Derlenmiş", derleyici paketi tarafından oluşturulan bayt-derlenmiş R kodu anlamına gelmez . <bytecode: 0x294e410>
Yukarıdaki çıkış çizgisi bayt derlenmiş olduğunu gösterir ve hala R komut hattı kaynağını görüntüleyebilir.
Fonksiyonlar bu çağrı .C
, .Call
, .Fortran
, .External
, .Internal
, veya .Primitive
tam olarak işlevini anlamak istiyorsanız derlenmiş kod kaynaklarına bakmak zorunda kalacak, böylece derlenmiş kod giriş noktalarını çağrıda bulunuyorlar. R kaynak kodunun bu GitHub aynası, başlamak için iyi bir yerdir. İşlev pryr::show_c_source
, sizi doğrudan GitHub sayfasına yönlendirecek .Internal
ve .Primitive
arayacak faydalı bir araç olabilir . Paketler kullanabilir .C
, .Call
, .Fortran
ve .External
; ancak değil .Internal
veya .Primitive
, çünkü bunlar R yorumlayıcısında yerleşik işlevleri çağırmak için kullanılır.
Yukarıdaki işlevlerden bazılarına yapılan çağrılar, derlenmiş işleve başvurmak için karakter dizesi yerine bir nesne kullanabilir. Bu gibi durumlarda, nesne sınıfının olduğu "NativeSymbolInfo"
, "RegisteredNativeSymbol"
ya da "NativeSymbol"
; ve nesnenin basılması yararlı bilgiler verir. Örneğin, optim
aramalar .External2(C_optimhess, res$par, fn1, gr1, con)
(not edin C_optimhess
, değil "C_optimhess"
). optim
istatistik paketinde olduğundan yazabilirsinizstats:::C_optimhess
çağrılan derlenmiş işlev hakkındaki bilgileri görmek .
Bir pakette derlenmiş kod
Derlenmiş kodu bir pakette görüntülemek istiyorsanız, paket kaynağını indirmeniz / paketinden çıkarmanız gerekir. Kurulu ikili dosyalar yeterli değildir. Bir paketin kaynak kodu, paketin orijinal olarak kurulduğu aynı CRAN (veya CRAN uyumlu) deposundan edinilebilir. download.packages()
Fonksiyon sizin için paket kaynağını alabilirsiniz.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Bu, Matrix paketinin kaynak sürümünü indirir ve ilgili .tar.gz
dosyayı geçerli dizine kaydeder. Derlenmiş işlevlerin kaynak kodu src
, sıkıştırılmamış ve yıldızlanmamış dosyanın dizininde bulunabilir . Sıkıştırma ve açma adımı adımı, işlevin dışında R
veya içinden R
yapılabilir untar()
. İndirme ve genişletme adımını tek bir çağrıda birleştirmek mümkündür (bir seferde yalnızca bir paketin bu şekilde indirilip paketlenebileceğini unutmayın):
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Alternatif olarak, paket geliştirme herkese açık olarak barındırılıyorsa (örneğin GitHub , R-Forge veya RForge.net aracılığıyla ), kaynak koduna çevrimiçi olarak göz atabilirsiniz.
Temel pakette derlenmiş kod
Bazı paketler "temel" paketler olarak kabul edilir. Bu paketler R ile birlikte gelen ve bunların sürüm içerir R. Örnek sürümüne kilitlenir base
, compiler
, stats
ve utils
. Bu itibarla, yukarıda açıklandığı gibi CRAN üzerinde ayrı indirilebilir paketler halinde mevcut değildirler. Aksine, altında ayrı paket dizinlerindeki R kaynak ağacının bir parçasıdırlar /src/library/
. R kaynağına nasıl erişileceği bir sonraki bölümde açıklanmaktadır.
R yorumlayıcısında derlenmiş kod
R yorumlayıcısında yerleşik olan kodu görüntülemek istiyorsanız, R kaynaklarını indirmeniz / paketinden çıkarmanız gerekir; veya kaynakları R Subversion deposu veya Winston Chang'ın github aynası aracılığıyla çevrimiçi olarak görüntüleyebilirsiniz .
Uwe Ligges'in R haber makalesi (PDF) (s. 43), kaynak kodunun .Internal
ve .Primitive
fonksiyonlarının nasıl görüntüleneceğine dair iyi bir genel referanstır . Temel adımlar önce işlev adını src/main/names.c
aramak ve daha sonra içindeki dosyalarda "C-giriş" adını aramaktır src/main/*
.