2017-11-23 8 views
2

methods(print)と入力すると、長いリストのメソッドが表示されます。どのメソッドを呼び出すのかをどのように知ることができますか?

クラスdata.frameのオブジェクトについては、print.data.frameと呼びます。

これは、しかし必ずしもそう単純ではないのです。

hw <- "hello world" 
class(hw) # [1] "character" 

print.character方法はありません。​​を実行するときに呼び出されるメソッドを知るにはどうすればよいですか?

+1

もし定義されていなければ、デフォルトメソッド – Dason

+0

'print.default'が存在しますが、' [.default'は、どのメソッドが 'c(" hello " "世界")[2] '? –

+0

Btw、 'strict'パッケージを見て、これをチェックし始めましたか? – amrrs

答えて

1
は、印刷のためのデバッグをオンにして、あなたの例を実行

> debug(print) 
> print("hello") 
debugging in: print("hello") 
debug: UseMethod("print") 
Browse[2]> <---------------------------- press Enter to step forward 
debugging in: print.default("hello") <-- this is the method that gets called 
debug: { 
    noOpt <- missing(digits) && missing(quote) && missing(na.print) && 
     missing(print.gap) && missing(right) && missing(max) && 
     missing(useSource) && missing(...) 
    .Internal(print.default(x, digits, quote, na.print, print.gap, 
     right, max, useSource, noOpt)) 
} 
+0

この場合は、この場合は、 'undebug(print)'を最後に呼び出すとうまくいきません。あるいは、あなたはいつまでも邪魔になります(2回デバッグする必要があるので、 'debugonce'は機能しません)。 'debug( '['); c(" hello "、" world ")[2]'を試しても動作しません。 –

1

あなたはハドレーのAdvanced Rを読み、オブジェクトに関する章がありますか?それはあなたにすべての答えを与えるかもしれませんが、基本的にあなたが経験しているのは、Cでのメソッドディスパッチと通常のS3動作の違いです。

[が本当にRの関数ではありません、それはCの関数とあなたが[(またはsumためのS3メソッドを作成することはできませんという意味ではありませんCで行われている使用するどのような方法の決定、+です、[<-と他の.Primitive関数)がありますが、そうすると、別の定義クラスに基づいてC関数によって最終的な決定が下される前に、RがディスパッチするC関数用のラッパー/プリプロセスを作成するようになりますあなたの普通の(そして拡張可能な)Rクラス。

少なくとも、それは私がそれを理解した方法です。

+0

とても感謝しています。だから私が間違っているなら誰でも私を修正してください.Cで書かれたS3ジェネリックは 'UseMethod'を呼び出さず、' methods'を使って推測しようとしますが、私はCコードを掘り下げ、 'DispatchGroup'や' DispatchOrEval'呼び出しを探す必要があります。私は 'pryr:ftype'を呼び出すことでそれらを認識することができ、プリミティブとして記述します。これらは例外ではなく、最初に調査したい機能ではありません。 –

+0

他のケースでは、 'my_function'がS3ジェネリックである限り、' my_function.my_class'が存在せず、 'my_class'が関数によって処理される場合、' my_function.default'は常に存在し、常に存在しますこれらの場合に呼び出される。 –

関連する問題