2016-09-06 1 views
3

通常は不思議なエラーがどこから来るのだろうかと疑問が湧きますが、私の質問はエラーの不思議な不足がどこから来るかです。なぜサブセットはデータフレームのサブセット引数が欠けても構わないのですか?

私は(私はいくつかのサブセットを取るが、サブセット機能のサブセットの引数を指定することを忘れたい)

subset(numbers,) 

を入力した場合、Rは、(それとして私を思い出させる

numbers <- c(1, 2, 3) 
frame <- as.data.frame(numbers) 

をしてみましょう必要があります):subset.defaultで

エラー(番号):
引数 "サブセット" は不足している、とデフォルト

は、私は(data.frame代わりのベクトルを持つので、同じもの)

subset(frame,) 

を入力するときしかし、それはエラーを与えませんが、代わりにちょうど(フル)データフレームを返します。

ここでは何が起こっていますか?どうして私はよく受け止められたエラーメッセージを受け取れないのですか?

答えて

8

tl; drsubset関数は、フィードされるオブジェクトのタイプによって異なる関数(異なるメソッドを使用します)を呼び出します。上記の例では、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でエラーをスローします。

関連する問題