関数のソース コードを見て、それがどのように動作するかを確認したいと思います。プロンプトで関数名を入力すると、関数を印刷できることはわかっています。
> t
function (x)
UseMethod("t")
<bytecode: 0x2332948>
<environment: namespace:base>
この場合、 はどういうUseMethod("t")
意味ですか? たとえば、 で実際に使用されているソース コードを見つけるにはどうすればよいですかt(1:10)
?
を見るUseMethod
と、 と を見るとstandardGeneric
、showMethods
のように違いがありますか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 つのパッケージのみをダウンロードして解凍できることに注意してください)。R
untar()
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
あるいは、パッケージ開発がパブリックにホストされている場合(例:GitHub、Rフォージ、 または翻訳元) の場合は、おそらくソース コードをオンラインで参照できます。
ベースパッケージ内のコンパイルされたコード
特定のパッケージは「基本」パッケージと見なされます。これらのパッケージは R に同梱されており、そのバージョンは R のバージョンにロックされています。例としてはbase
、、、、などcompiler
があります。したがって、これらは上記のように CRAN で個別にダウンロード可能なパッケージとして入手することはできません。むしろ、これらは の下にある個別のパッケージ ディレクトリ内の R ソース ツリーの一部です。R ソースにアクセスする方法については、次のセクションで説明します。stats
utils
/src/library/
Rインタープリタに組み込まれたコンパイル済みコード
Rインタープリタに組み込まれているコードを表示したい場合は、Rソースをダウンロード/解凍する必要があります。または、RSubversion リポジトリまたはウィンストン・チャンのgithubミラー。
ウーヴェ・リッゲスのR ニュース記事 (PDF).Internal
(p. 43) は、および関数のソース コードを表示する方法についての一般的な参考資料として役立ちます.Primitive
。基本的な手順は、まず で関数名を検索しsrc/main/names.c
、次に のファイルで「C エントリ」名を検索することですsrc/main/*
。