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ミラーは、開始するのに適切な場所です。この関数pryr::show_c_source
は、GitHubページに直接アクセスして呼び出すことができるので、便利なツールに.Internal
なり.Primitive
ます。パッケージには、使用することができ.C
、.Call
、.Fortran
、と.External
。しかしではありません.Internal
か、.Primitive
、これらはRインタプリタに組み込まれた機能を呼び出すために使用されるため。
上記の関数の呼び出しでは、コンパイルされた関数を参照するために、文字列ではなくオブジェクトを使用する場合があります。そのような場合、オブジェクトは、クラスのものである"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
は、圧縮されていないtarファイルのディレクトリにあります。圧縮解除と風袋引きの手順はR
、の外部で、または関数R
を使用して内部から実行できますuntar()
。ダウンロードと拡張のステップを1つの呼び出しに組み合わせることができます(この方法では、一度に1つのパッケージのみをダウンロードして解凍できます)。
untar(download.packages(pkgs = "Matrix",
destdir = ".",
type = "source")[,2])
あるいは、パッケージ開発が公にホストされている場合(GitHub、R-Forge、またはRForge.netなど)、ソースコードをオンラインで閲覧できます。
基本パッケージのコンパイル済みコード
特定のパッケージは「基本」パッケージと見なされます。これらのパッケージはRで出荷し、そのバージョンが含まR.例のバージョンにロックされているbase
、compiler
、stats
、とutils
。そのため、上記のようにCRANで個別にダウンロード可能なパッケージとして使用することはできません。むしろ、それらはの下の個々のパッケージディレクトリのRソースツリーの一部です/src/library/
。Rソースへのアクセス方法については、次のセクションで説明します。
Rインタープリターに組み込まれたコンパイル済みコード
Rインタープリターに組み込まれているコードを表示する場合は、Rソースをダウンロード/アンパックする必要があります。または、R SubversionリポジトリまたはWinston Changのgithubミラーを介してソースをオンラインで表示できます。
Uwe LiggesのRニュース記事(PDF)(p。43 )は、.Internal
および.Primitive
関数のソースコードを表示する方法の一般的な参考資料です。基本的な手順は、最初にで関数名をsrc/main/names.c
検索し、次にでファイル内の「C-entry」名を検索することですsrc/main/*
。