ggplot2とproto
ggplot2内でprotoを使っているが、protoの有効範囲はggplot2の名前空間内に閉じ込められているようだ。require(proto)すると事情が違ってくる。
protoパッケージをロードしている状態だと、protoオブジェクトxに対して x$class()関数が使えるようになる。仮想的なメンバが追加されるようだ。
これは、protoパッケージが、"$"汎用関数のメソッドである"$.proto"関数を定義していたのだった。$も組み込みではなくてユーザー定義だった(忘れていた)。これを使って仮想的なメンバーを定義できるわけだ。なるほど。
ggplotオブジェクトはS3オブジェクトだが、scalesメンバーはR5らしい。modeでは"S4"と出るが、printするとreference classと出るのでR5なのだろう。R5クラスのメンバーアクセスは"$"となる。x$getClass() でクラス情報を得られる。そのクラス情報は、なんとS4オブジェクトらしい。
S4オブジェクトの構造を参照するには str(object) とする。R5オブジェクトでも str(object) は使える。