tl; dr:subset
関数は、フィードされるオブジェクトのタイプによって異なる関数(異なるメソッドを使用します)を呼び出します。上記の例では、subset(numbers,)
はsubset.default
を使用し、subset(frame,)
はsubset.data.frame
を使用しています。
Rには、いくつかのオブジェクト指向システムが組み込まれています。最も簡単で最も一般的なものをS3と呼びます。このOOプログラミングスタイルは、Wickhamが「汎用関数OO」と呼ぶものを実装します。このようなOOのスタイルでは、ジェネリック関数と呼ばれるオブジェクトがオブジェクトのクラスを調べ、オブジェクトに適切なメソッドを適用します。直接メソッドが存在しない場合は、常に使用可能なデフォルトメソッドがあります。
S3がどのように機能し、他のOOシステムが機能するかを知るには、Advanced Rサイトの関連する部分をチェックしてください。オブジェクトの適切なメソッドを見つける手順は、メソッドディスパッチと呼ばれます。詳細については、ヘルプファイル?UseMethod
を参照してください。
?subset
の詳細セクションに記載されているように、subset
関数は「汎用関数」です。これは、subset
が最初の引数でオブジェクトのクラスを調べ、メソッドディスパッチを使用してオブジェクトに適切なメソッドを適用することを意味します。一般的な機能の
方法は
<総称関数名>としてエンコードされています。 <クラス名>
とmethods(<generic function name>)
を使用して見つけることができます。 subset
のために、我々は、オブジェクトがデータを持っている場合ことを示している
methods(subset)
[1] subset.data.frame subset.default subset.matrix
see '?methods' for accessing help and source code
を取得します。subset
はメソッド(関数)をsubset.data.frame
と呼びます。サブセット引数が欠落している場合、最初の行は
r <- if (missing(subset))
rep_len(TRUE, nrow(x))
はdata.frameと同じ長さのTRUESのベクトルを生成し、最後こと
subset.data.frame
function (x, subset, select, drop = FALSE, ...)
{
r <- if (missing(subset))
rep_len(TRUE, nrow(x))
else {
e <- substitute(subset)
r <- eval(e, x, parent.frame())
if (!is.logical(r))
stop("'subset' must be logical")
r & !is.na(r)
}
vars <- if (missing(select))
TRUE
else {
nl <- as.list(seq_along(x))
names(nl) <- names(x)
eval(substitute(select), nl, parent.frame())
}
x[r, vars, drop = drop]
}
注:以下のように定義されますライン
x[r, vars, drop = drop]
を使用すると、サブセット引数が含まれていなかった場合は、その後、subset
機能は、データのすべての行を返すことを意味し、行の引数には、このベクトルを供給します。フレーム。
methods
コールの出力からわかるように、subset
には、原子ベクトルのメソッドはありません。これはあなたのエラーとして、subset.defaultで
エラー(数字)あなたはベクトルにsubset
を適用すると
は、Rは
subset.default
function (x, subset, ...)
{
if (!is.logical(subset))
stop("'subset' must be logical")
x[subset & !is.na(subset)]
}
として定義されて
subset.default
メソッドを呼び出すことを意味し、
subset.default
関数は、サブセット引数がない場合にstop
でエラーをスローします。