Rソースコードへのグラフ埋め込みをサポートするinlineR.elを書いてみた


Rの大きな魅力の一つが強力なグラフィックス機能であることに、最早異論を挟む余地はありません。そして、ほとんどのユーザに何かしら作図をする機会があるはずです。

さて、そのグラフィックスの出力はどうやって出力していますか?

別ウィンドウで出してますか?

それとも画像で保存して、画像ビューワかなんかで見ますか?

めんどくないですか? どっちも。

作図も1枚程度なら気になりませんが、何十枚も作っていると、ウィンドウの往復なり視線の移動に辟易してきます。Rハカーは、コードを読むとそのグラフを脳内補完できるという話ですが、残念ながらそこまでの能力はありません。

せめて、コードを読むようにグラフを眺めたい!! というわがままを叶えてみました。

inlineR.elとは

元々Emacsには画像を描画する機能があります。また、cacoo.elやiimage.elなどは、任意のタグを読みこむことで簡単に画像をインライン表示することができます。inlineR.elは、Rの作図関数を読みこんで画像を出力、cacoo.elやiimage.elが読みこめるタグを挿入するelispです。

インストール

githubに置いてます。ダウンロードしてロードパスの通ったところに置いたら、後は(require ‘inlineR)と.emacsとかに書けば終わりです。

myuhe/inlineR.el – GitHub

当然ですが、ESSが必要です。事前に入れておきます。

ESS – Emacs Speaks Statistics

それと、ないといけないわけでなありませんが、cacoo.elを併用するとさらに便利になると思うので、導入をおすすめします。インストール、使い方は@kiwanamiさんの記事を参考にしてください。

Emacsでスムーズに図形編集ができるようになるcacoo.elを作ってみた

使い方

まず、Rで作図関数を使ったコードを書いてみましょう。

その時、書いたコードがplot()など単一の関数で完結するものは括弧の内側にカーソルを合わせます。ggplot2など複数の関数が使われる場合は実行したい部分をリージョン選択します。

そして、”M-x inlineR-insert-tag”とすると、画像のフォーマット、名前がミニバッファで聞かれてくると思いますので、適宜入力します。

すると、カーソルの後にタグが挿入されます。

https://cacoo.com/diagrams/w4qQSvMvZ6yiBBxV-92FE7.png

この時、cacoo.elがインストールされていれば、cacoo.elに対応したタグが挿入されますので、”M-x toggle-cacoo-minor-mode”とすると、画像がインライン表示されるはずです。

cacoo.elがインストールされていなければ、iimage.elに対応したタグが挿入されます。”M-x iimage-mode”とすることで同様に画像がインライン表示されます。

設定

設定項目をいくつか設けています。お好みに応じて変更してください。

・inlineR-re-funcname
Rの作図関数を正規表現で指定します。ここで指定するとリージョン選択しなくてもタグを挿入することができます。
・inlineR-default-image
ミニバッファに最初に表示されている画像フォーマットです。デフォルトは”png”です。
・inlineR-default-dir
作図した関数を保存するディレクトリを指定します。デフォルトではカレントディレクトリです。
・inlineR-cairo-p
Cairoパッケージを使った出力の有無を指定します。デフォルトでは使用しません。使用する場合は事前にCairoパッケージを読みこんでおく必要があります。

カスタム例

カスタムはこんな感じになると思います。

(setq inlineR-re-funcname "plot\|image\|hogehoge\|my-func") ;;my-funcなどの作図関数追加
(setq inlineR-default-image "jpeg") ;;デフォルトをjpegに
(setq inlineR-default-dir "/tmp/") ;;tmpディレクトリに画像を出力
(setq inlineR-cairo-p t) ;;Cairoパッケージを使う

EmacsひきこもりRライフ

グラフがインラインで表示されると、データの入力に始まり、コーディング、作図までがソースコード中で眺めることができるので、全体の流れが非常に追いやすくなります。 ますますEmacsへのひきこもりっぷりが加速すること間違いなしです!!