Nasıl bir fonksiyon için kaynak kodunu görebilir miyim?
Nasıl çalıştığını görmek için bir işlev için kaynak kodu bakmak istiyorum. İsteminde adını yazarak bir işlev yazdırma biliyorum:
> t
function (x)
UseMethod("t")
<bytecode: 0x2332948>
<environment: namespace:base>
Bu durumda, UseMethod("t")
ne anlama geliyor? Nasıl o aslında tarafından kullanılan kaynak kodu bulurum, örneğin: 14**?
Diğer durumlarda, R kod biraz var, ama işin çoğunu başka bir yerde yapılmış gibi görünüyor.
> matrix
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
{
if (is.object(data) || !is.atomic(data))
data <- as.vector(data)
.Internal(matrix(data, nrow, ncol, byrow, dimnames, missing(nrow),
missing(ncol)))
}
<bytecode: 0x134bd10>
<environment: namespace:base>
> .Internal
function (call) .Primitive(".Internal")
> .Primitive
function (name) .Primitive(".Primitive")
Nasıl .Primitive
işlevi ne öğrenebilirim? Benzer şekilde, bazı fonksiyonlar.C
, , *, *20.Call
.Fortran
, ya da .Internal
Ara. Nasıl kaynak kodunu nereden bulabilirim?
CEVAP
UseMethod("t")
t()
farklı nesne sınıfları için yöntem (S3) genel bir işlevi olduğunu söylüyor.
S3 yöntemi gönderme sistemi
S3 sınıflar için methods
işlevi belli genel bir işlev veya sınıf yöntemleri listesi için 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ünür olmayan fonksiyonları asterisked "" işlevidir paketi ad verilen değil. Hala getAnywhere()
kullanarak :::
fonksiyonu üzerinden, ya da kaynak kodunu görüntüleyebilirsiniz. getAnywhere()
işlevi gelen bilmek zorunda değilsiniz, çünkü yararlıdır.
> 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 gönderme sistemi
S4 sistemi daha yeni bir yöntem, sistem gönderme ve S3 sistem için bir alternatiftir. Burada S4 bir fonksiyon ö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 birçok bilgi bulunmaktadır. standardGeneric
S4 bir işlevin bir göstergesidir. Tanımlanan görmeye yöntemi S4 yöntemleri yardımsever sunulmaktadır:
> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"
getMethod
yöntemlerden biri kodu: kaynağını 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 örneğin her yöntemin daha karmaşık bir imza ile, bir yöntem vardır
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"
Kaynak bu yöntemlerden biri için bütün imza kodunu görmek için, örneğin sağlanmalıdır
getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )
Kısmi imza temini için yeterli değil
getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") :
# No method found for function "extract" and signature SpatialPolygons
Arama işlevleri kod derlenmiş
"Yarattığı" ifade etmez bayt derlenmiş kod R . derlenen not ^strong>derleyicipaket. Yukarıdaki çıktıda <bytecode: 0x294e410>
çizgi fonksiyonu bayt derlenmiş olduğunu gösterir, ve hala R komut satırından kaynağı görüntüleyebilirsiniz.
Fonksiyonlar Ara .C
, .Call
, .Fortran
, .External
, .Internal
, ya .Primitive
diyor giriş noktaları derlenmiş kod, bu yüzden size bakmak zorunda kaynaklardan derlenmiş kod istiyorsanız, tam olarak anlamak işlevi. Paketleri kullanabilir .C
, .Call
, .Fortran
, .External
; ama .Internal
veya .Primitive
, çünkü bunlar kullanılan arama fonksiyonları inşa halinde R tercüman.
Yukarıda bazı işlevleri için çağrılar derlenmiş işlev başvurusu için bir karakter dizesi yerine bir nesne kullanabilir. Bu gibi durumlarda, nesne sınıfı "NativeSymbolInfo"
, "RegisteredNativeSymbol"
"NativeSymbol"
; ve nesnenin yararlı bilgiler verir yazdırıyor. Örneğin, optim
55 çağrı* *(C_optimhess
, "C_optimhess"
unutmayın). optim
stats:::C_optimhess
derlenmiş işlevi çağrılmak hakkında bilgi almak yazabilmeniz için istatistik paketi.
Bir paket derlenmiş kodu
Eğer bir paket içinde derlenmiş kod görüntülemek istiyorsanız,/paketten indirmek gerekecektir paketi kaynağı. Yüklenen dosyalar için yeterli değildir. Bir paketin kaynak kodu aynı, BOZUK (ya da BOZUK) uyumlu paketi yüklenmiş depo mevcut. download.packages()
işlevi paketi için kaynak alabilir.
download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")
Bu Matris paketi kaynak sürümünü indirin ve geçerli dizindeki .tar.gz
ilgili dosyayı kaydedin. Derlenmiş fonksiyonları için kaynak kodu sıkıştırılmamış ve untared dosyası src
dizininde bulunabilir. Açma ve untaring adım R
içinde untar()
işlevini kullanarak R
, ya da dışında yapılabilir. İndir birleştirmek mümkündür ve tek bir çağrı ile (bir seferde yalnızca bir paket ve bu şekilde indirilen çözdükten olabilir unutmayın) adım genişleme:
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
Eğer paket geliştirme kamuya barındırılan alternatif olarak, (*,* 79 ** 78 RForge.net) gibi), muhtemelen kaynak kod online göz atabilirsiniz.
Temel bir paket derlenmiş kodu
Belirli paketleri "baz" paketleri kabul edilir. Bu paketler R ile gemi ve onların sürümbase
, compiler
, stats
, utils
vardır R. Örnekleri sürümü kilitli. Gibi, yukarıda açıklandığı gibi HUYSUZ ayrı indirilebilir paket olarak kullanılamaz. Daha doğrusu, /src/library/
altında bireysel paketi dizinleri R kaynak ağaç parçası. R kaynağına erişmek için nasıl bir sonraki bölümde açıklanmıştır.
Derlenmiş kod R tercüman yerleşik
Eğer görmek istersen kodu built-in için R tercüman gerekecektir indir/paketten R kaynakları; veya Görünüm online kaynaklar ile R Subversion repository Winston Chang's github mirror.
Uwe Ligges R news article (PDF) (s. 43) .Internal
74* fonksiyonları için kaynak kodunu görüntülemek için nasıl iyi bir genel bir referanstır. Temel adımları ilk src/main/names.c
işlev adı için bakmak ve daha sonra "C-giriş" src/main/*
. dosya adı arama
Nasıl kaynak bir Python fonksiyon kodu...
Nasıl SVN bir dosya için tüm tarihsel ...
Nasıl gıt için taahhütte bulunmadan ön...
Nasıl bir C programı derleme kodunu gö...
Nasıl JavaScript arayan almak için fon...