SORU
7 EKİM 2013, PAZARTESİ


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
7 EKİM 2013, PAZARTESİ


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • William Hyde

    William Hyde

    23 HAZİRAN 2008