cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

見えないRの関数のソースコードを読む

要約

  • lookupパッケージで標準の関数定義ソースコードの出力機能を改善する
    • 総称関数や.C(), .Internal()などの関数で呼び出されるコードも出力
  • prettycodeパッケージで関数定義のハイライトを有効にする
  • prettycodeはRの起動時に読み込み、lookupは適宜、名前空間を指定してlookup::lookup()で実行、という運用にした

ソースコードの閲覧機能の向上とハイライト機能

最近ちょくちょく、Rのソースコードの読み方が変わっていくんではないかなと思っています。読み方というか出力方法というか。

百聞は一見に如かず。次の画像をご覧ください。この画像には通常のRでのソースコード出力と異なる点が2箇所あります。

f:id:u_ribo:20170810075403p:plain

この画像はターミナル上で起動したRで、head()ソースコードを表示している場面です。何かお気づきになられるでしょうか。手元にRを実行できる環境がある方は、同じようにソースコードを表示してみると良いかもしれません。

通常のRの実行結果と異なるのは次の点です。

  • 関数のソースコードがハイライトされている
  • 隠蔽される総称関数のクラスへの参照を行っている

これは通常のRでは行えない機能です。ではどうやっているのかというのが今回の話であり、今後のスタンダードになり得るのではないかと思っているものです。

Rでは、関数名をコンソールに打ち込んでエンターを押すとソースコードが出力されます。ですが、そのままではハイライトはされないし、head()のような総称関数では別途、getS3method("head", "default")を実行しないと隠蔽されたソースコードを読むことができません。

prettycodeおよびlookupはそれぞれ、関数のハイライト、ソースコードの出力機能を改善機能を提供します。prettycodelookupをインストールすると自動的にインストールされるので、試したい方はlookupをインストールしましょう。CRANには登録されていないのでGitHub経由で行う必要があります。

# githubinstall::githubinstall('lookup')
library(lookup)

lookupを実行するとprettycodeによるコードのハイライトと関数の出力機能改善が有効になります。

始めの画像のように、lookupソースコードの出力を行うと、通常のRの挙動とは異なり目的のソースコードをきちんと表示してくれます。Rでは総称関数のようにある関数のメソッドとして定義された関数や.Internal(), .External(),.C(), .Call()によって呼び出される関数のソースを確認するには、逐次的に探索していく必要がありますがlookupを使うとこれらのソースコードの出力が簡単になります。

RStudioでlookupを読み込み、関数のソースコードを出力させると、ソース区画のタブでコードが表示されます。総称関数や.Callなどで呼び出されるコードについても同様にタブで出力されます。いずれもハイライトが有効化されており、オブジェクトがわかりやすくなっています。

運用方法

lookupのコード出力はGitHubに登録されているリポジトリのコードを読みにいくことで実現しています。そのためにGitHub APIを利用しており、認証のない状態では時間あたりの利用回数に制限があります。ですので、トークンを発行し設定して規制を緩和させることが推奨されています。

このような理由もあることから、私はlookupの読み込みは行わず、ソースを見たいときにlookup::lookup("function")のようにして必要な時にだけ有効にすることにしました。一方で通常の関数ソースコードの出力はハイライトさせたいのでprettycodeは.Rprofileに記述し、起動時に読み込むようにしました。

これまで隠蔽されたコードを読むには、面倒な手続きやいくつかの操作が必要でしたが、lookupを使うことで手間が大きく省けそうです。

Enjoy!