2012-05-09 5 views
4

私は、どのようにしてそれが何を探しているのか(つまり、MyGeneric(x)クラスがMyClass:MyGeneric.MyClassクラスのxで呼び出された)数字がわかると、UseMethodがメソッドを見つける方法を見つけようとしています 特に、どのような環境が関わっていますか?UseMethodの検索メカニズムについての混乱

検索メカニズムを指定していないR言語マニュアルの "5.3メソッドディスパッチ"と "5.4 UseMethod"のセクションを読んでいます。 UseMethodためのR-ヘルプページには、手がかりを提供しています。

...UseMethod and NextMethod search for methods in two places: 
first in the environment in which the generic function is called, 
and then in the registration data base for the environment 
in which the generic is defined (typically a namespace) 

しかし、これは(=私の頭の中で)まで追加されません。ここでは具体的な例を示します。

library(xts) 
as.matrix # shows UseMethod("as.matrix") 
methods("as.matrix") # shows as.matrix.xts. * indicates non-visible 
showMethods("as.matrix") # says <not an S4 generic function> 
data(sample_matrix) 
as.matrix(as.xts(sample_matrix)) # how does R find as.matrix.xts?? its not exported! 

as.matrixnamespace:baseで定義されています。 Rがその環境または呼び出し環境(R_GlobalEnv)を使用する場合は、エクスポートされていないのでas.matrix.xtsが見つかりませんでした。 as.matrix.xtsが呼び出し環境にあるため、xts内の関数がas.matrixを呼び出すと呼び出し環境が動作するように見えます。私は何が欠けていますか?

+0

これは、その部分を理解する即時の質問に、一般的に両方(同様に助けになるかもしれませんR言語マニュアルの)http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/ – mweylandt

+1

mweylandt - 十分に面白い、それは私のブログ投稿です=)ジェネリックについてのセクションを追加する必要があるようです通常の検索/発見機構から逸脱した機能/方法。この物がどれくらい複雑かというと、ちょっとイライラしています。 – SFun28

+0

それは私が思う小さな世界です;-)あなたが反論しなければ、これを跨いで他の誰かのために残しておきます。 – mweylandt

答えて

3

十分に慎重に読んでいるわけではありません。 「登録データベース」は、メソッド自体ではなく、汎用の環境(名前空間)に格納されているという。 base::as.matrixの場合:ロードNAMESPACEにいる....私の知識に追加ジョシュアの洞察力に加えて

> grep("as.matrix",ls(base:::.__S3MethodsTable__.), value=TRUE) 
[1] "as.matrix.dist" "as.matrix.raster" "as.matrix.xts" "as.matrix.zoo" 
+0

クール!これは、取り付けられているxtsとロードされているxtsに依存しますか? xtsがMyPackageのImportsにリストされていて、MyPackageを添付しているので(xtsがsearch()にないので)、as.matrixはまだジェネリックの環境に保存されていますか? – SFun28

+0

@ SFun28:名前空間の読み込み中または検索パスへの添付中に登録が行われるかどうかによって異なります。私はどちらの場合がわからない。 –

1

は、エクスポートされると同じではありません。あなたはこれらのいずれかでas.matrix.xts機能を見ている可能性があり:

getAnywhere(as.matrix.xts) 
xts:::as.matrix.xts 

は私もどちらかのSO上で見られるか、Rインタプリタのを表示するであろう機能をrhelpいる

search() 

を入力してみてください関数呼び出しの検索パスですが、現時点では見つからないようです。これは、関数名のかなり長いリスト生成:

apropos("as", mode="function") 

を、このリストには、まだ半分の長さだった:

apropos("^as\\.", mode="function") 
+0

getAnywhere()について知っておいてよかった、それは私にとって初めてのことです。それはas.matrix.xtsの検索パスをかなり簡単にリストすることができます(stackoverflow.com/questions/8637107/parent-env-x-confusionを参照してください)が、どのようにRが与えられた-exported関数です。あなたがそれを掘り起こすことができれば、それは本当に役に立つでしょう。 – SFun28

+0

トリプルドット演算子は、私が知っている最も強力な検索方法です。関数がロードされる必要はなく、ライブラリパス上のインストールされたパッケージにしか存在しません。 –

+0

が正しいが、ベストプラクティスとしては避けるべきである。 – SFun28