始める無料で始める

名前に込められた意味は?

S3 では厳格な命名規則を用います。すべての S3 メソッドは generic.class という形式の名前になります。

逆は成り立ちません。ドットを含む名前でも、S3 メソッドではない関数があります。これは S 言語の初期からある多くの関数に当てはまります。たとえば、all.equal()docs)は実際にはメソッドではなく S3 のジェネリックです。(これは leopard.case が紛らわしい例です。)

関数が S3 のジェネリックかどうかは、pryr パッケージの is_s3_generic()docs)を呼び出して確認できます。コンソールで関数名をそのまま入力して中身を表示し、UseMethod() を呼んでいるかどうかを確認する方法もあります。

同様に、関数が S3 メソッドかどうかは、pryris_s3_method()docs)で確認できます。例えば、

library(pryr)
is_s3_generic("t")           # 転置のジェネリック関数
is_s3_method("t.data.frame") # data.frame 用の転置メソッド
is_s3_method("t.test")       # スチューデントの t 検定用の関数

どの記述が正しいでしょうか?

  1. is.complex()docs)は、complex オブジェクトに作用する is ジェネリックのメソッドである。
  2. seq.Date()docs)は、Date オブジェクトに作用する seq ジェネリックのメソッドである。
  3. is.na.data.frame()docs)は、data.frame オブジェクトに作用する is.na ジェネリックのメソッドである。
  4. sort()docs)はジェネリック関数である。
  5. order()docs)はジェネリック関数である。

この演習はコースの一部です

R における S3 と R6 を使ったオブジェクト指向プログラミング

コースを見る

実践的なインタラクティブ演習

理論を実践に変える、インタラクティブな演習のひとつをお試しください

演習を開始する