12

私はどのように機能するかを理解しようとしてNextMethod()います。S3 クラス システムについて私が見つけた最も詳細な説明は、Chambers & Hastie (edts.) のStatistical Models in S (1993 年、Chapman & Hall) にありますが、NextMethod呼び出しに関する部分は少しあいまいです。以下は、私が理解しようとしている関連する段落です (pp. 268-269)。

への呼び出しの結果として呼び出されるメソッドに目を向けると NextMethod()、これらのメソッドは、前のメソッドから特別な呼び出しで呼び出されたかのように動作します。継承されたメソッドの呼び出しの引数は、現在のメソッドの呼び出し (したがって、ジェネリックの呼び出し) と同じ数、順序、および実引数名になります。ただし、引数の式は、現在のメソッドの対応する仮引数の名前です。たとえば、式print(ratings)がメソッドを呼び出したとしますprint.ordered()。このメソッドが を呼び出すとき 、これはフォームのへNextMethod()の呼び出しと同等です。ここで、は のフレーム内にあり ます。複数の引数が仮引数に一致する場合"print.factor()print.factor(x)xxprint.ordered()..."、これらの引数は、継承されたメソッドの呼び出しで表されます y 特別な名前 " ..1"、" ..2" など。エバリュエーターはこれらの名前を認識し、適切に処理します (例については、476 ページを参照してください)。

このやや微妙な定義は、S における関数呼び出しのセマンティクスがメソッドの使用にできるだけきれいに引き継がれるようにするために存在します (Becker、Chambers、および Wilks のThe New S Language、354 ページを比較してください)。特に:

  • NextMethod()引数は、呼び出された時点での現在の値とともに、現在のメソッドから継承されたメソッドに渡されます。
  • 遅延評価は引き続き有効です。未評価の引数は未評価のままです。
  • 欠落している引数は、継承されたメソッドで欠落したままです。
  • " " 仮引数を介して渡された...引数は、正しい引数名で到着します。
  • 呼び出しの実際の引数に対応しないフレーム内のオブジェクトは、継承されたメソッドに渡されません。」

引数に関する限り、継承プロセスは基本的に透過的です。

ややこしいと思ったのは次の2点です。

  1. 「現在の方法」と「以前の方法」とは何ですか?
  2. 「継承されたメソッドの呼び出しの引数」、「引数の式」、および「現在のメソッドの対応する仮引数の名前」の違いは何ですか?

一般的に言えば、誰かが上記の段落で与えられた説明をより明確な方法で言い換えることができれば、私はそれを感謝します.

4

2 に答える 2

11

NextMethodこの記事をすべて読み通すのは難しいですが、この小さな例がディスパッチを分かりやすくするのに役立つと思います。

'first' と 'second' の 2 つのクラス属性 (継承) を持つオブジェクトを作成します。

x <- 1
attr(x,'class') <- c('first','second')

次に、オブジェクトを印刷するgenericメソッドを作成しますCat

Cate <- function(x,...)UseMethod('Cate')

Cateクラスごとにメソッドを定義します。

Cate.first <- function(x,...){
  print(match.call())
  print(paste('first:',x))
  print('---------------------')
  NextMethod()                ## This will call Cate.second
}

Cate.second <- function(x,y){
  print(match.call())
  print(paste('second:',x,y))
}

Cateこれで、次の例を使用して呼び出しを確認できます。

 Cate(x,1:3)
Cate.first(x = x, 1:3)
[1] "first: 1"
[1] "---------------------"
Cate.second(x = x, y = 1:3)  
[1] "second: 1 1" "second: 1 2" "second: 1 3"
  • Cate.second の場合、前のメソッドは Cate.first です
  • 引数 x と y は、NextMethod() が呼び出された時点での現在の値とともに、現在のメソッドから継承されたメソッドに渡されます。
  • 「...」仮引数を介して渡された引数 y は、正しい引数名で到着します Cate.second(x = x, y = 1:3)
于 2014-01-05T11:53:33.197 に答える