1. Learn
  2. /
  3. Courses
  4. /
  5. R における S3 と R6 を使ったオブジェクト指向プログラミング

Connected

Exercise

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

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

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

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

同様に、関数が S3 メソッドかどうかは、pryr の is_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)はジェネリック関数である。

Instructions

50 XP

Possible answers