関数のソースコードを表示するにはどうすればいいですか? 質問する

関数のソースコードを表示するにはどうすればいいですか? 質問する

関数のソース コードを見て、それがどのように動作するかを確認したいと思います。プロンプトで関数名を入力すると、関数を印刷できることはわかっています。

> t
function (x) 
UseMethod("t")
<bytecode: 0x2332948>
<environment: namespace:base>

この場合、 はどういうUseMethod("t")意味ですか? たとえば、 で実際に使用されているソース コードを見つけるにはどうすればよいですかt(1:10)?

を見るUseMethodと、 と を見るとstandardGenericshowMethodsのように違いがありますかwith?

> with
standardGeneric for "with" defined from package "base"

function (data, expr, ...) 
standardGeneric("with")
<bytecode: 0x102fb3fc0>
<environment: 0x102fab988>
Methods may be defined for arguments: data
Use  showMethods("with")  for currently available ones.

他のケースでは、R 関数が呼び出されていることはわかりますが、それらの関数のソース コードが見つかりません。

> ts.union
function (..., dframe = FALSE) 
.cbind.ts(list(...), .makeNamesTs(...), dframe = dframe, union = TRUE)
<bytecode: 0x36fbf88>
<environment: namespace:stats>
> .cbindts
Error: object '.cbindts' not found
> .makeNamesTs
Error: object '.makeNamesTs' not found

.cbindtsや のような関数を見つけるにはどうすればよいですか.makeNamesTs?

さらに他のケースでは、R コードが少しありますが、ほとんどの作業は別の場所で行われているようです。

> 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")

関数が何をするのかを知るにはどうすればよいですか? 同様に、、、、、または を呼び出し.Primitiveます。.Cそれらのソース コードはどうすれば見つかりますか?.Call.Fortran.External.Internal

ベストアンサー1

UseMethod("t")t()S3) さまざまなオブジェクト クラス用のメソッドを持つ汎用関数。

S3方式ディスパッチシステム

S3 クラスの場合、このmethods関数を使用して、特定の汎用関数またはクラスのメソッドを一覧表示できます。

> 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

「非表示の関数にはアスタリスクが付いています」とは、関数がパッケージの名前空間からエクスポートされていないことを意味します。関数:::(つまりstats:::t.ts) を介して、または を使用して、ソース コードを表示できますgetAnywhere()getAnywhere()関数がどのパッケージからのものかを知る必要がないため、 は便利です。

> 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方式ディスパッチシステム

S4 システムは新しいメソッド ディスパッチ システムであり、S3 システムの代替となります。以下は 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.

出力にはすでに多くの情報が含まれています。standardGenericは S4 関数のインジケーターです。定義されている S4 メソッドを確認するための便利なメソッドが提供されています:

> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"

getMethodいずれかのメソッドのソースコードを表示するには、次のコードを使用します。

> getMethod("chol2inv", "diagonalMatrix")
Method Definition:

function (x, ...) 
{
    chk.s(...)
    tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>

Signatures:
        x               
target  "diagonalMatrix"
defined "diagonalMatrix"

各メソッドにはより複雑なシグネチャを持つメソッドもあります。例えば、

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"

これらのメソッドのソースコードを見るには、シグネチャ全体を提供する必要があります。例:

getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )

部分的な署名だけでは不十分である

getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") : 
#  No method found for function "extract" and signature SpatialPolygons

エクスポートされていない関数を呼び出す関数

の場合ts.union.cbindtsおよび は名前空間.makeNamesTsからエクスポートされていない関数です。または 演算子statsを使用すると、エクスポートされていない関数のソース コードを表示できます。:::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>

コンパイルされたコードを呼び出す関数

「コンパイル済み」は、コンパイラパッケージによって作成されたバイトコンパイルされた R コードを指すのではないことに注意してください。<bytecode: 0x294e410>上記の出力の行は、関数がバイトコンパイルされていることを示しており、R コマンド ラインからソースを表示することもできます。

.C、、、、、または.Callを呼び出す関数は、コンパイルされたコード内のエントリ ポイントを呼び出しているため、関数を完全に理解したい場合は、コンパイルされたコードのソースを確認する必要があります。.Fortran.External.Internal.PrimitiveこれR ソースコードの GitHub ミラーは、開始するには適切な場所です。 関数は、および呼び出しの GitHub ページに直接移動できるので、便利なツールになります。パッケージでは、、、、pryr::show_c_sourceを使用できますが、またはは使用できません。これらは、R インタープリターに組み込まれた関数を呼び出すために使用されるためです。.Internal.Primitive.C.Call.Fortran.External.Internal.Primitive

上記の関数の一部を呼び出すと、コンパイルされた関数を参照するために文字列ではなくオブジェクトが使用されることがあります。その場合、オブジェクトはクラス"NativeSymbolInfo""RegisteredNativeSymbol"、または であり"NativeSymbol"、オブジェクトを印刷すると役立つ情報が得られます。たとえば、optimは呼び出します.External2(C_optimhess, res$par, fn1, gr1, con)(C_optimhessではなく であることに注意してください"C_optimhess")。optimは stats パッケージに含まれているため、と入力するstats:::C_optimhessと、呼び出されるコンパイルされた関数に関する情報を表示できます。

パッケージ内のコンパイルされたコード

パッケージ内のコンパイル済みコードを表示する場合は、パッケージ ソースをダウンロード/解凍する必要があります。インストールされたバイナリだけでは不十分です。パッケージのソース コードは、パッケージが最初にインストールされたのと同じ CRAN (または CRAN 互換) リポジトリから入手できます。関数を使用すると、download.packages()パッケージ ソースを取得できます。

download.packages(pkgs = "Matrix", 
                  destdir = ".",
                  type = "source")

これにより、Matrix パッケージのソース バージョンがダウンロードされ、対応する.tar.gzファイルが現在のディレクトリに保存されます。コンパイルsrcされた関数のソース コードは、圧縮および解凍されたファイルのディレクトリにあります。圧縮および解凍の手順は、 の外部で実行することも、関数を使用してR内部から実行することもできます。ダウンロードと展開の手順を 1 回の呼び出しに組み合わせることもできます (この方法では、一度に 1 つのパッケージのみをダウンロードして解凍できることに注意してください)。Runtar()

untar(download.packages(pkgs = "Matrix",
                        destdir = ".",
                        type = "source")[,2])

あるいは、パッケージ開発がパブリックにホストされている場合(例:GitHubRフォージ、 または翻訳元) の場合は、おそらくソース コードをオンラインで参照できます。

ベースパッケージ内のコンパイルされたコード

特定のパッケージは「基本」パッケージと見なされます。これらのパッケージは R に同梱されており、そのバージョンは R のバージョンにロックされています。例としてはbase、、、、などcompilerがあります。したがって、これらは上記のように CRAN で個別にダウンロード可能なパッケージとして入手することはできません。むしろ、これらは の下にある個別のパッケージ ディレクトリ内の R ソース ツリーの一部です。R ソースにアクセスする方法については、次のセクションで説明します。statsutils/src/library/

Rインタープリタに組み込まれたコンパイル済みコード

Rインタープリタに組み込まれているコードを表示したい場合は、Rソースをダウンロード/解凍する必要があります。または、RSubversion リポジトリまたはウィンストン・チャンのgithubミラー

ウーヴェ・リッゲスのR ニュース記事 (PDF).Internal(p. 43) は、および関数のソース コードを表示する方法についての一般的な参考資料として役立ちます.Primitive。基本的な手順は、まず で関数名を検索しsrc/main/names.c、次に のファイルで「C エントリ」名を検索することですsrc/main/*

おすすめ記事