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


このところ、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://cacoo.com/diagrams/FEx40rTFyloulHAW-9FF50.png

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://cacoo.com/diagrams/JO3z9U1OSVzR6xWG-B9A23.png

表示したい作図関数の指定には、以前作った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://cacoo.com/diagrams/EA1qCHZGNURz7ZMK-B9A23.png

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://cacoo.com/diagrams/TCaz1fSVsDsqT6JP-B9A23.png

パースペクティブ

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に動揺し悶々として何も手につかなかったり、自己満足的な支援活動に手を染めるより、今までどおりフツーに日記でも書いて、少しずつでも前進していることの方がよっぽど大事なことだと思うようになりました。というわけで、マスコミの歪んだ地震報道を避けつつ前進していこうと思います。

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

  • Pingback: e2wmでブックマークを操作するプラグイン、e2wm-bookmark.el()

  • kazuki

    初心者です。「prefixキーに続き、gを入力します。ggplot2など複数の関数から構成されている場合や自作関数などの場合はリージョン選択した後に打鍵してください。」というのはどうやるのですか

    • kazuki

      ぐぐってましたがよくよんだら書いてありました。デフォルトで「C-c ;」ですね。

      • myuhe

        わかりにくくて、すみません。
        デフォルトで「C-c ;」です。他にわからないところあったら気軽に聞いてください。

        • kazuki

          返信有り難うございます。大変便利なので英語の紹介ページもあるといいですね。

          • myuhe

            いずれ書きたいなーとは思っていますが、私の英語力は乏しいため、あまり期待せずお待ちくださいw

  • Tetu

    素晴らしい物をありがとうございます。
    最近emacsを始めた初心者ながら魅力に負けて導入しようと挑戦したいと思いました。
    ところで、
    上記の記事の「インストール」の項目の

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

    とありますが、これはどこから見られるでしょうか。見せて頂けると導入の非常に参考になります。
    どうぞ、よろしくおねがいします。

    • myuhe

      リンクがついていませんでしたね。 すみません。。。
      リンクを追加しましたので、ご確認ください。
      他にもわからない点ありましたら、遠慮なくお尋ねください!!

      • Tetu

         導入できました!!!
        若干この記事の時点の設定よりも進んでいたので苦労しましたがなんとかなりました。
        Rをemacsで使うに当たりいろいろ本当にお世話になりました。
        これからも開発よろしくおねがいします。

        • myuhe

           いろいろとお手数おかけしてしまってすみませんorz
          何かわからないところやおかしいところあったら教えてください。

          また、近々改修したものをアップデートする予定なので、そちらも試していただければ嬉しいです!!

          • Tetu

            また改修されるんですか。
            非常に楽しみにしております!!
            是非是非試させて頂きます。
            なかなか専門的な世界で丁寧に説明して頂き私みたいな超初心者には本当に助かります。
            これからもどうぞよろしくおねがいします。

  • Pingback: R用ウィンドウマネージャー e2wm-R.el 0.4をリリースしました()

  • BK

    最近、Rにはまって、おまけにEmacsに出会って、理想の環境を求めてたどり着きました。
    導入はできたのですが、R-diredとimenuがうまく作動しません。

    mainのESSに、x<-rnorm(100)などのサンプルをいれ、C-c C-jで実行、M-x ess-rdiredとすると、新しくバッファー(*R dired*)が開くのですが・・・なんとも美しくない有様で

    myuheさんの.emacsの設定を完全コピーすればいいかと思い、やってみるとエラー(void-variable office-p)が・・・

    Rstudioも好きなのですが、Emacs+e2wm-Rで引きこもりたいです。お時間のあるときにコメントいただければと。あと、素敵な拡張をありがとうございます。

    環境は、Ubuntu12.10、Emacs24.1.1、ESS12.09-2(ess-rdiredは付属しておりパスも通ってます)です。

    • myuhe

      使っていただきありがとうございます。

      R-diredですが、プラグインの中ですでに動作していますので、M-x ess-rdiredのようにしてユーザが手動で動作させるのを想定していません。
      というのも、R-diredプラグインで表示されるものとほとんど変わらないためです。
      また、何か不明なところありましたら、遠慮なくお尋ねください。

      • BK

        すみません。
        質問の仕方が悪かったようです。
        端的に申しますと、下記の原因が分からず悩んでおります。

        問題:プラグインのR-diredとimenuが動作しておらず、オブジェクトが表示されない。

        • myuhe

          BKさんの環境で試してみたところR-diredがうまく動作していないことを確認しました。改修を行ないますので、しばらくお待ちください。解決した時の連絡はここのコメントで良いですか?

          imenuについては、正しく動作しているようです。お手数ですが再度確認していただけると助かります。

        • myuhe

          R-diredプラグインのバグを修正しました。以下に最新版を置いてますので、試していただけないでしょうか?よろしくお願いします。

          https://github.com/myuhe/e2wm-R.el

          • BK

            myuheさん
            ありがとうございます。
            動くようになりました。気持ちいいです、とても。
            データの海を潜水艦でもぐってるぜ〜みたいな気分になれて最高です。