S3クラスの効用
わたし一般ユーザーやしRでクラスとか使わんわーよう使わんわーという人、多いと思います。
しかしS3クラスは便利です。
たとえばprint関数の挙動をみてみましょう。
以下はシンプルな因子をprintした例です。
> smp <- factor("a") > print(smp) [1] a Levels: a
この時、実はsmpのクラスであるfactorに応じてprint.factor関数が呼ばれています。
ということは任意のクラスを付与して、それに応じたS3クラスの関数を定義してみるとどうなるでしょう。
> class(smp) <- "tokorosawa" > print.tokorosawa <- function(x)print("yeahhhhhhhhh!!!!!") > print(smp) [1] "yeahhhhhhhhh!!!!!"
オブジェクトには任意のS3クラスを設定でき、それに応じた関数は関数名の後に.classという形で定義できます。
これを応用することで以下の記事のようにswitch代わりにS3が使えたりします。小粋ですね。
http://notchained.hatenablog.com/entry/2015/11/12/011800
ちなみに私もかつてjaguchiパッケージで同じような実装をしました。
https://github.com/dichika/jaguchi/blob/master/R/jaguchi.R
なお、Rのクラスにも色々あり、S3、S4、RC(Reference class、R5という人も)が組み込みで実装されており、外部パッケージだとprotoとかR6というのもあります。
ていうかそもそもS3クラスってC++とかPythonでいうところのクラスぽくない、ちょっと意味がわからない、という人も多いのではないでしょうか。
そんな方はAdvanced Rを読んでください。
どうやら翻訳も出るらしいですよ。
- 作者: Hadley Wickham,石田基広,市川太祐,高柳慎一,福島真太朗
- 出版社/メーカー: 共立出版
- 発売日: 2016/02/10
- メディア: 単行本
- この商品を含むブログ (29件) を見る