EmacsでのR開発環境をRstudio、Eclipseライクにするe2wm-R.el

NO IMAGE

このところ、R界隈では新しく公開されたRstudioというIDEの話が飛びかっておりました。

RStudio

これが、かなり完成度が高いです。補完機能はもちろんのこと、パッケージマネージャ、オブジェクトマネージャーなど洒落た機能まで持っています。しかもサーバ版まで。githubのコミットログを見てみると12月頃から開発が始められているようなので、3ヶ月ほどで完成したことになります。いやーすごいです。

Rstudioに始まったことではなく、R関連のエディタ、IDEはすでに成熟した分野となりつつあります。gedit、notepad+などの主要なエディタにはすでにR用の拡張がありますし、当然あのEclipseにもR用の拡張があります。

R を Eclipse で使う – hamadakoichi blog

ほんの数年前までは、Rの開発環境といえばEmacs以外の何かなどありえませんでした。それが今やこれだけ選択肢が増えたのですから、喜ばしい限りです。一方でEmacsでの開発環境であるESSはそれらと比較すると、まだまだ改良の余地があるな、とぼんやり思っていました。

というわけで、他のIDE、特にRstudioの機能を参考にESSの新しいインターフェイスを考えていて、どうにか形らしいものになったのでご紹介します。e2wm-R.elといいます。

e2wm-R.elとは

e2wm-R.elは、Emacs上でのRコーディング作業をサポートするウィンドウマネージャです。id:kiwanamiさんが作られたe2wm.el上で動作します。e2wm.elについてはkiwanamiさんが詳しく説明されていますので、まずはそちらを見ていただいた方が良いと思います。

広くなった画面を有効利用できる、Emacs内Window管理ツール e2wm.el を作ってみた。(旧名称 ewm.el) – 技術日記@kiwanami

まずは、起動直後のデフォルト画面です。

kiwanamiさんの説明に倣い、このウィンドウのレイアウトのことをパースペクティブ、メインウィンドウ以外のウィンドウで動いている、コーディングをサポートするプログラムをプラグインと呼ぶことにします。 e2wm-R.elでは、mainウィンドウでのコーディング作業に他のプラグインをうまく使うことで、効率良く作業ができるようになっています。各プラグインについては後ほど説明するとして、まずはインストールしてみます。

インストール

e2wm-R.elは以下のelispに依存しています。ロードパスの通ったディレクトリに配置しといてください。ESSに標準添付されているess-rdiredも使っています。ESSをインストールした時点で問題ないはずですが、ロードできない時は同じくロードパスの通ったディレクトリに置いておいてください。 ESS e2wm.el window-layout.el inlineR.el e2wm-R.el それと、imagemagicのconvertコマンドを使っています。Linuxなら問題ないと思いますが、WindowsであればCygwin経由でインストールするか、本家から.exeをパスの通ったところに置くかしておいてください。

ImageMagick: Convert, Edit, Or Compose Bitmap Images

なおWindowsの場合、「Documents and Settings」など空白を含むパスがあるとうまく動かないみたいなのでご注意を。

参考までに僕の設定ファイルをさらしときます。

http://gist.github.com/1835332

さて、やっとプラグインについてです。e2wm-R.elでは、主に三つのプラグインと二つのパースペクティブを定義しています。次から、どういったプラグインがあるのか説明していきます。

R-diredプラグイン

R-diredプラグインは、ESSに標準添付されているess-rdiredをe2wmに特化させたもので、現在のワークスペースに登録されたオブジェクトを管理するオブジェクトマネージャの機能を担当するプラグインです。画面上ではオブジェクトの名前、型、長さが表示され、新しいオブジェクトが登録されるとほぼ自動で更新されます。

https://i2.wp.com/cacoo.com/diagrams/FEx40rTFyloulHAW-9FF50.png?w=1100&ssl=1

R-diredプラグインはウィンドウにフォーカスが移ると各オブジェクトに対していろいろとアクションできるようになっています。キーバインドはデフォルトで以下のように割りあてています。

 
j,n,C-n, 次の行へ移動
k,p,C-p, 前の行へ移動
v 内容を表示
d 削除するオブジェクトをマーク
u 削除するオブジェクトをアンマーク
x マークしたファイルを削除
s ソート
y 型を表示
p グラフを描画
g 再表示
q mainに戻る

R-graphicsプラグイン

R-graphicsプラグインは、コード中の作図関数で生成されたグラフなど画像の表示を担当するプラグインです。

https://i2.wp.com/cacoo.com/diagrams/JO3z9U1OSVzR6xWG-B9A23.png?w=1100&ssl=1

表示したい作図関数の指定には、以前作ったinlineR.elの機能を使っています。以前書いたinlineR.elの日記についてもご覧ください。

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

作図関数の実行には、inlineR.elと時と同様にplot、imageなどの単独で完結するメジャーな作図関数については、関数の後に続く括弧の間にカーソルを合わせ、prefixキーに続き、gを入力します。ggplot2など複数の関数から構成されている場合や自作関数などの場合はリージョン選択した後に打鍵してください。

するとまず、カレントディレクトリに作られている「.Rgraphics」に出力した画像が保存されます。そして「.Rthumnail」にR-graphicsプラグインのウィンドウサイズにリサイズされた画像が保存され、その画像がR-graphicsプラグインのウィンドウに表示されます。また、出力された画像は次に説明するR-graphics-listプラグインに登録されることになります。

通常使う場合、画像のファイル名はtimestampとなっていますが、prefixキーに続き、Gを入力すると、出力する画像に名前をつけることができます。ミニバッファでファイル名を尋ねられますので適宜入力してください。

R-graphics-listプラグイン

R-graphics-listプラグインは、R-graphicsプラグインで出力した画像の管理を担当するプラグインで、R-graphicsプラグインに出力された画像がリストアップされていきます。

https://i2.wp.com/cacoo.com/diagrams/EA1qCHZGNURz7ZMK-B9A23.png?w=1100&ssl=1

R-diredプラグインと同様、フォーカスがあたっていると、各ファイルに対して様々なアクションが選択できます。キーバインドは次のようになっています。

 
j,n,C-n, 次の行へ移動
k,p,C-p, 前の行へ移動
v R-graphicsプラグインに画像を表示
d 削除するファイルをマーク
u 削除するファイルをアンマーク
D 全てのファイルをマーク
U 全てのファイルをアンマーク
x マークしたファイルを削除
g 再表示
q mainに戻る

R-graphics-listプラグインは、R-graphicsバッファと合わせて使うことを想定しています。例えば、これまでのESSの使い方で過去に出力したグラフなどを再度見たい場合、Rのグラフィックデバイスで記録した履歴をさかのぼるか、画像で出力したものを別の画像ビューワなどのアプリを使って閲覧するか、という(まわりくどい)二つの方法があったわけですが、R-graphics-listプラグインを使うことで、Emacsの中だけで完結し、しかも画像出力の履歴も(ある程度)管理できるというメリットがあります。

https://i1.wp.com/cacoo.com/diagrams/TCaz1fSVsDsqT6JP-B9A23.png?w=1100&ssl=1

パースペクティブ

Rで解析する際、作業の段階として主に「入力、解析、出力」の三つがあるんではないかな、と思っています。入力、解析については、他の言語の条件とたいして変わらないと思いますが、出力についてはグラフなどの画像出力を行なうことが多くなってくるという点でかなり異なり、コードとグラフ双方の情報を見やすく配置する必要があると思います。 というわけで、今回はそれぞれの作業段階で使えそうな二つのパースペクティブを準備しました。

ただ、見栄えは人の好みが大きくわかれるところですし、そのうえあらゆるサイズのディスプレイに対応したパースペクティブを作るのはかなり無理そうです。プラグインの配置やウィンドウのサイズは是非自分で設定してみることをお勧めします。設定については、kiwanamiさんの説明を読まれるか、コード中のコメントを見ると良いと思います。

R-codeパースペクティブ

R-codeパースペクティブはe2wm.elに標準であるcodeパースペクティブをベースに味付けしたものです。

]

メインのウィンドウが中央上部、Rプロセスバッファが中央下部、プラグインウィンドウが左右に配置されています。視線の移動が少なく、快適にコード書きができます。

以下のキーバインドがデフォルトで定義されています。なお、以下の表中のprefixはew2mで定義されているprefixキーのことで、デフォルトで「C-c ;」となっています。

 
prefix i imenuバッファに移動
prefix l R-graphics-listバッファに移動
prefix d R-diredバッファに移動
prefix s subバッファに移動
prefix c 美人時計をトグル表示
prefix g R-graphicsバッファに画像を表示
prefix G R-graphicsバッファにファイル名を指定して画像を表示
prefix m メインバッファを最大化

R-viewパースペクティブ

R-codeパースペクティブは、グラフによるデータの視認、グラフ作成などでの使用を想定したパースペクティブです。

R-codeパースペクティブと比較するとプラグインの数も減り、メインバッファも左に寄っているので、でかいディスプレイを使っていると首を痛めてしまいそうですが、そのぶんR-graphicsプラグインのウィンドウが大きく表示されるため、グラフの細かな調整などの作業時に重宝しそうです。

その他の細かいこと

ウィンドウのコントロールがたまにうまくいかず、レイアウトが崩れたりすることがあります。そんな時はパースペクティブの設定をリロードすると良いです。インストールの説明の際に晒した設定をそのままコピペしているのであれば、「prefix 6」または「prefix 7」を打鍵するとレイアウトが回復するはずです。 画像の出力の処理がイマイチです。特にループ回して大量の画像を吐くコードなどをR-graphicsプラグインに投げるとハングするので、そういった場合は、ふつーに画像出力するか、

東北地方太平洋沖地震に際して

実は、今回の日記は先週の10日頃にはほとんど書きあがっていて後は公開を待つばかりという状態だったのですが、公開を前にして東北地方太平洋沖地震が発生しました。

僕の住んでいる熊本で変わったことと言えば九州新幹線が開業したくらいで他はびっくりするほど何も変わらない日々でして、このような大変な事態にありながらこんな日記を書いている場合なのか?とか、そんなことしてるくらいなら、日記を置いているサーバの電源を切る方が有益なんぢゃないのか?などと考えていたわけです。これについては全くの杞憂だったわけですけれども。

と、そのようなことを考えながら、Twitterや、テレビの報道を見ていてなんとなく頭の整理がついてきたので、しっかりと文章に残しておくことにしました。

まず、一般市民の身近な支援活動はそんなに多くないと思いました。できて金銭的な支援くらいだけなのだろう、と思いました。

それとテレビの報道は歪んだ悲壮感を演出しているのではないか、という疑念を持つようになりました。ただ、このことについては、まだ謎な点があって、そのような演出をして誰が得をするのかということがわかりません。そういった映像が視聴率を稼ぐとも思えませんし、被害を最小限に食いとめようと多くの人が尽力しているなか、その行為をあざ笑うかのような悲壮感を演出した報道は不快感さえ感じました。この疑問について詳しい方いらしたら教えてもらえると凄く嬉しいです。

そして、歪んだテレビの報道やチェーンメールまがいのRTに動揺し悶々として何も手につかなかったり、自己満足的な支援活動に手を染めるより、今までどおりフツーに日記でも書いて、少しずつでも前進していることの方がよっぽど大事なことだと思うようになりました。というわけで、マスコミの歪んだ地震報道を避けつつ前進していこうと思います。

後、僕ができることは願うことくらいです。これ以上被害が拡大しないことを心から願います。