このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

ggplot2のソースを読んで

  • ggplotオブジェクト: S3クラスのオブジェクト。実体はリスト。メンバー列挙はnames(p)、メンバアクセスは p$m
  • layerオブジェクト: protoオブジェクト。実体は環境(environment)。メンバー列挙はls(lay)、メンバアクセスは lay$m
  • statオブジェクト: protoオブジェクト。実体は環境(environment)。メンバー列挙はls(st)、メンバアクセスは st$m
  • scaleオブジェクト: S3クラスのオブジェクト。
  • ggplotオブジェクトのscalesメンバー: なぜかR5クラスのオブジェクト参照。メンバー列挙はls(sc)、メンバアクセスは sc$m。奇妙だ。

関数の第1引数が「.」のとき、それはthisの意味らしい。つまり、メソッド。

layerオブジェクトには、geomメンバーとstatメンバーがあり、どちらも値はprotoオブジェクト(参照)。lay$geom$objname、lay$stat$objname でgeom種別、stat種別が取れる。単にgeomとstatのprintでも種別は表示される。print.proto()を経由してobjnameメンバーを表示するらしい。

レイヤー内のデータを見るには、lay$data。

プロットのp$layersはリストで、リストの各項目はレイヤーであるprotoオブジェクト。p$layers1$geom, p$layers1$stat, p$layers1$data のようにしてアクセスできる。

statに対して、st$default_aes(), st$default_geom() でデフォルトを得られる。st$required_aes は文字列ベクトルで、必須aes属性の名前が入っている。実際の計算処理は、st$calculate()とst$calculate()とst$callulate_groups()関数。calculateは、dataとscalesが必須。scalesはプロットのp$scalesから持って来るのか? 型宣言がないのでこのへんの予測が付きにくい!辛い。

stat_binのcalculateの実体は、ggplot2:::bin関数。stat_binで生成されるprotoオブジェクトのcaluculate関数はggplot2:::binを呼び出している。 args(ggplot2:::bin) で引数を確認できる。 ggplot2:::bin(runif(10)) で計算できる。

statのst$calculate内で .$informed(真偽値)にアクセスすることがある。.は第1引数でthisまたはselfに対応。第2引数であるdataは、元データのデータフレームではなくて、aes対応が終わった段階でのデータフレーム。stat_binのときなら、data$x が必要。

scaleには、continuous, discreteの別があるらしい。*.continuous, *.discreteというメソッド関数がある。scale自体はS3クラスのオブジェクトで、 class = c(scale_name, "continuous", "scale")) または、 class = c(scale_name, "discrete", "scale")) で生成される。scaleのコーディングは完全にS3方式のようだ。

それにしても、「...」引数は便利ともいえるが、仕様の読み取りが困難でコードを読む側からはサイテー。「...」(残余引数)に型が付けられれば良いが、型もないから情報量がゼロだ。