「Lisp」タグアーカイブ

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へのひきこもりっぷりが加速すること間違いなしです!!

(kumamoto-emacs #01)をやってきました

先週の土曜日は kumamoto-emacs、 通称 E熊cs をやりました。

(kumamoto-emacs #x01) : ATND

今回の参加者は10名。Vimユーザの方にも参加していただきました。ありがとうございます。

発表件数2件に対し、時間が4時間もあるという無計画なプランだったので、まず参加者の方に事前に作成してもらったポジションペーパーを使って、いろいろ話してもらいました。

ポジションペーパーのお題の中に「使っているエディタの主な用途」というものがあったのですが実にいろいろな使われ方をしていて、Emacsの懐の深さを感じました。 Vim使いのaharisuさんからは

#ekumacs 「エディタの主な用途ってエディット以外にあるの?この質問おかしくね?」Sat Dec 04 05:30:23 via web

まあ、普通はそうですよね。。。

僕からは、Emacs上でのRの使いかたを話させてもらったのですが、即興で入れてみたキータイプを表示するアプリがawesomeと相性が悪かったり、試しに書いたRのコードが動かなかったりとグダグダでした。 いちお使ったスライドも置いておきます。

kiwanamiさんからは、これまでに作ったものを網羅的に紹介してもらいました。 現在開発中のelispの話題なども。否が応にも楽しみです!!

初めて他人が操作するEmacsを見て、大いに刺激を受けました。特にkiwanamiさんのEmacsを見ると、入力すること、見ることに対する工夫がいろいろされていて、早速いろいろパクらせてもらいました。

kumamoto-emacsはこれからも定期的に開催する予定です。お近くにお住いの方は是非参加してみてください!!

Rの環境操作とクロージャ

折を見て、Common Lisp関連の書籍を読んでいます。なかなか進まないのですが。。。
何を調べていた時か忘れてしまいましたが、こちらで次のようなコードを見つけました。

Javascriptとかでもよく見かけるクロージャのサンプルですね。
で、はたと気になりました。Lispの影響を強く受けているRではどのように書けるのかと。
ちょっと書いてみました。

Rでは、CLのletにあたる関数がありません(多分)。なのですが、そもそもRには環境自体を作成、操作できる関数があるので、そちらを使うこととします。

…期待どおりの動作をしてくれません。環境とクロージャ環境中のオブジェクトを表示してみます。


関数が呼ばれる度に新しい環境が作成されていて、counterは新しい環境内の変数となっているようです。

ということで、Rでは関数内で定義された変数の扱いがCLと違うようで、CLでは親環境にまで派生しますが、Rでは親環境にまで派生しないようです。
Rのスコーピング規則は、Ross先生がSとの互換性を捨ててまでこだわったところらしいので、このような仕様にしているのは何か理由があるのでしょう。破壊的な代入が親環境にまで影響するのが嫌だったとかなのかなー
詳しくはわからないんですが、Pythonのジェネレータっぽいことしたい時はどうすれば良いんだろう。クラス作れとかってことなんでしょうかね。

ちなみに、Rのレキシカルスコープについては、以下の書籍が詳しいです。

Rの基礎とプログラミング技法

著者/訳者:U.リゲス

出版社:シュプリンガー・ジャパン(株)( 2006-10-22 )

定価:

単行本 ( 258 ページ )

ISBN-10 : 4431712186

ISBN-13 : 9784431712183


idle-require.elでEmacsの起動を高速にする

Emacsは、標準の状態では正直使い勝手の良い代物ではありません。いろいろと手を加えることで至高の環境になると思うのですが、そこで新たに問題となってくるのが起動時間。便利なelispを導入するほど起動に時間がかかるようになってきます。特にこれがないとやってられないってくらい重要なelispに限って重量級なことが多く、例えば当方のPCだとyasnippet.elでは1.3秒、anything.elに至っては2秒弱ほど読みこむのに時間がかかっています。
ええ、知ってますとも。Emacsは一度起動したら終了せずに使うものだということを。そして、emacsclientという便利なものもあることを。
ただ、シャバはそんなに甘くありませんです。Emacsだって不意に落ちることはあります。非力なPCで使っていれば、メモリを開放するためやむなくEmacsを終了することだってあります。emacsclientはすごく便利なので、すぐに使えるようにPCを起動した際に自動的にemacs –daemonを起動するように設定しているのですが、Emacs自体の起動時間がかかるようになると、そもそもPC自体の起動が遅くなるという便利なのか不便なのかよくわからない状況になっていました。
これではいけません。

requireをautoloadに置き換え

起動時間に関する問題は今に始まったことではないので、Emacs自体にも高速化のための機能が備わっています。その一つがautoloadです。これは、autoloadに引数として渡される関数が呼ばれた時にファイルをロードするというものです。特にメジャーモード、マイナーモードをロードする時には、積極的にrequireをautoloadに置きかえるようにしてます。autoloadについては以下のサイトで詳しく説明されています。

GNU Emacs Lispリファレンスマニュアル: Autoload
ひとつの .emacs で設定を、、その2。 – 日々、とんは語る。
autoload-if-found に関数リストを渡したい – jimo/memo
Meadow/Emacs memo: Meadow 関連の少し高度な知識

idle-require.elでさらに高速化

autoloadはメジャーモードなどロードする関数が集約的な時にはその威力を発揮しますが、ユーティリティ関数などが複数含まれたものだと関数全てに対して書く必要があるのでかなり面倒です。
そういった関数にはマジックコメントを用いたautoloadの方法も提供されているのですが、ソースコードに直書きしないといけないのでお行儀も良くありませんし、開発者による今後のアップデートのことも考えればあまり良い方法ではなさそうです。
ここで、idle-require.elの出番です。
idle-require
idle-require.elは、provideされているelispをEmacsが起動した後に遅延ロードするのを補助するものです。使いかたもいたって簡単。まず.emacsとかの先頭の方に(require ‘idle-require) (idle-require-mode 1)と書いて読みこみます。後は遅延ロードしたいelispでrequireされてるものをidle-requireで読みこみます。例えば、これまで(require ‘hogehoge)等として読みこんでいたのを(idle-require ‘hogehoge)と書きかえれば良いだけです。とても簡単です。
ただ、公開されているものだとロードの順番が逆になってしまうのが嫌だったので少し修正してみました。修正したものはgistに置いてます。

ひたすら高速化

後は、autoloadなりidle-require.elを使って起動時間を縮めていきます。起動時間の計測にはこちらの方法を使わせてもらいました。その結果、僕の環境では、1秒を切るくらいの速度で起動できるようになりました。特にidle-require.elについてはemacsclientとの相性がすこぶる良いと思いました。emacsclientはPCを起動してすぐ使うという代物でもないので、とりあえず後でチマチマ読みこむようにしておいて、起動時間だけを短縮しておけば、気兼ねなくPCの起動に合わせてemacs –daemonを起動できます。
ただ、何でもかんでも遅延させれば良いってものでもなく、あくまで使い勝手とのトレードオフです。
てことで、ご利用は計画的に。。。

今週の気になるアレNovember 10th

twitter (feed #2)
日記書いた-> 今週の気になるアレNovember 3rd http://bit.ly/cjbMIH [myuhe]
twitter (feed #2)
いいなーこれ。日本で発売するのかな? "juggly.cn » Sony EricssonのBluetoothアクセサリ「LiveView」は11月19日英国で発売予定" – http://j.mp/daFwEp [myuhe]
twitter (feed #2)
RT @yomi0512: 「おい白川、何だこの伝票!」『知りません』「間違った処理されてるだろうが!」『私じゃありません』「じゃあ誰だ!?」『分かりません』「ならお前だろ!」『ここが会社じゃなかったら』「拳と拳で」『「語り合えるのに」』 [myuhe]
twitter (feed #2)
I’m at としのり歯科. http://4sq.com/ai44ED [myuhe]
delicious (feed #4)
twitter (feed #2)
I’m at ホテル 熊本テレサ. http://4sq.com/aOcJoe [myuhe]
twitter (feed #2)
ノートPCを職場に忘れた \(^o^)/ [myuhe]
twitter (feed #2)
代わりに、職場のTOUGHBOOK持って帰ってきてもうた。。。 [myuhe]
twitter (feed #2)
I’m at 白川公園. http://4sq.com/b2ufos [myuhe]
googlereader (feed #6)
twitter (feed #2)
#Ekumacs の打ち合わせから帰宅であります!! [myuhe]
twitter (feed #2)
【訃報】熊本県在住 母艦PCさんのHDDが本日お亡くなりになられました。。。 [myuhe]
twitter (feed #2)
ブータブルCDから起動を試みましたが、すでにアクセスすることすらできない状態でした。心からお悔やみ申しあげます。 [myuhe]
twitter (feed #2)
とりあえず、新調するHDDを物色するか。。。 [myuhe]
twitter (feed #2)
たいしたデータは入ってないものの、インストールとか面倒くさすぎなんだなー [myuhe]
twitter (feed #2)
HDDって、2TBでも1万円しないんですね。。。 いや、助かるんですけど、そんなに安くても良いのかなと。。。 [myuhe]
twitter (feed #2)
#Ekumacs 今日の打ち合わせ内容を簡単ですがまとめてみました!! http://j.mp/chaEFB [myuhe]
twitter (feed #2)
#Ekumacs やる前にlingrなりIRCでこれまでのEmacs勉強会の内容とか反省点とかをみんなでお話できると面白いかなーとか思ったり。 [myuhe]
twitter (feed #2)
あ、その前にHDD注文しとかないと。2TBのやつで良いよねー。多分ほとんど使わないと思うけど。 [myuhe]
twitter (feed #2)
それと、熊本にEmacsユーザって本当に少ないのか、な話も出てたす。#Ekumacs [myuhe]
twitter (feed #2)
HDDの注文完了!! [myuhe]
twitter (feed #2)
そういえば、Rの新しいR5クラスってどうなんですかね?個人的には、S3クラスなものに回帰してほしいなー。S4めんどくさすぎて。。。後CLOSな雰囲気がどんどんなくなってくというのも少し悲しい。 [myuhe]
twitter (feed #2)
RってS互換にこだわる必要ってあるんだろか。 [myuhe]
delicious (feed #4)
googlereader (feed #6)
twitter (feed #2)
I’m at 火の国 文龍 総本店. http://4sq.com/92K2c2 [myuhe]
twitter (feed #2)
先日、お亡くなりになったHDD,去年あたりに騒動になったseagateのやつだった。情弱っぷりに泣ける。。。 [myuhe]
twitter (feed #2)
seagateのHDD,自分で直すこともできるみたいね。 "Seagate製HDD 解析まとめ – トップページ" – http://j.mp/aEDRpk [myuhe]
twitter (feed #2)
【ゆるぼ】 seagateのロック状態を自力で直した方いますか? [myuhe]
twitter (feed #2)
入力速度が速くなると、AZIKを無視しているとゆー本末転倒っぷり。 [myuhe]
twitter (feed #2)
それでも二重母音のpは脊髄反射レベルで指が動くようになってきた。 [myuhe]
twitter (feed #2)
Pythonてば、Best Programming Language Best Scripting Languageで二冠ですか "Readers’ Choice Awards 2010 | Linux Journal" – http://j.mp/9R3eQc [myuhe]
twitter (feed #2)
ちなみに、Best IDE部門ではEmacsは圏外ですた。。。 "Readers’ Choice Awards 2010 | Linux Journal" – http://j.mp/9R3eQc [myuhe]
twitter (feed #2)
結婚式二次会の案内メールを大量に送信。あ、自分のではないですので為念。 [myuhe]
twitter (feed #2)
AZIKの二重母音って、SKKの送り仮名との相性がいまいちな気がしてきた。例えば「赤い」と書きたい時って、SKKでは AkaI と書くけど、二重母音を駆使すると akq て打ってしまって送り仮名あり変換がうまいこといかないのでイライラしたりする [myuhe]
twitter (feed #2)
同居人にAZIKの素晴らしさを力説したが、理解してもらえなかった。。。 [myuhe]
twitter (feed #2)
ってことで、同居人PCのIMをuim-Anthyからuim-mozcに変えてあげるなど。 [myuhe]
twitter (feed #2)
AZIKの学習コストってSKKよりは高いよね、やっぱり。。。 [myuhe]
delicious (feed #4)

今週の気になるアレNovember 3rd

googlereader (feed #6)
Shared yas-jit.el.
googlereader (feed #6)
googlereader (feed #6)
delicious (feed #4)
googlereader (feed #6)
googlereader (feed #6)
delicious (feed #4)
Shared ENSIME.
googlereader (feed #6)
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)

今週の気になるアレOctober 20th

googlereader (feed #6)
delicious (feed #4)
Shared Wanderlust.
googlereader (feed #6)
delicious (feed #4)
Shared 図解 Git.
delicious (feed #4)
Shared Emacs Lisp.
delicious (feed #4)

今週の気になるアレOctober 13th

delicious (feed #4)
googlereader (feed #6)
twitter (feed #2)
今日のBGM – リヴィング・ダート / トミー・ゲレロ http://htn.to/hHQtQa [myuhe]
twitter (feed #2)
I’m at らーめん 三楠. http://4sq.com/c16xKL [myuhe]
twitter (feed #2)
リアルな願い事やな http://twitpic.com/2wcfdi [myuhe]
googlereader (feed #6)
twitter (feed #2)
最近のweezer、良い曲多いなー [myuhe]
twitter (feed #2)
jackassメンバーとweezerが一緒にやるPVで、リヴァースが今にも殺されなそうな顔してるのが笑える [myuhe]
twitter (feed #2)
あ、ubuntu10.10でたのか。今回は見送りかなー [myuhe]
twitter (feed #2)
mark ronsonのPVって日本人から見ればネタ乙!!くらいしか思わないけど、フランス人から見れば超クール!!とか思われてるのかな。。。 [myuhe]
twitter (feed #2)
RT @nitro_idiot: Emacs Lispで正規表現書いたら8割がバックスラッシュになった [myuhe]
twitter (feed #2)
PCが熱暴走でストップ。今10月で合ってるよね。。。 [myuhe]
delicious (feed #4)
twitter (feed #2)
TL見てたら、なぜかubuntuアップデートした方が良いような気がしてきた [myuhe]
twitter (feed #2)
熱でPCとまるのが怖いので扇風機あてながらアップグレード作業を行なってみるす [myuhe]
delicious (feed #4)
twitter (feed #2)
今日から楽できるはずだったのに、いっこうに楽になる気配がない。怖い。 [myuhe]
twitter (feed #2)
若者の不安にくらべれば、シニア世代の不安なぞ鼻糞程度だと思う。 "不発に終わった団塊退職特需:日経ビジネスオンライン" – http://j.mp/9uuC7z [myuhe]
twitter (feed #2)
うちの親父とか連絡しても、たいてい家にはいないでどこそこ遊びに行ってるし、常に遊ぶことだけ考えてる気がする。それで良いんだと思う。 [myuhe]
twitter (feed #2)
まあ、誰が悪いとかじゃなくて、こればかりは運だよねー [myuhe]
twitter (feed #2)
RT @tkf: pythonのすごいところは,「誰が書いても同じようになる」っていうどう考えて無理なことを目標に掲げて,プログラマがそれを意識するように仕向けたことなんじゃないか,って思ってしまう. [myuhe]
twitter (feed #2)
run_or_raise良いね [myuhe]
twitter (feed #2)
viなキーバインドになれないけど、なれてみる [myuhe]

Emacs上でgistを操作するanything-gist.elをアップデートしました。

gistをAnything経由で便利に操作するelisp、anything-gist.elをアップデートしました。
主な変更点は以下のとおり。
・これまで候補の表示がIDとdescriptionだけだったものにファイル名を追加
・候補のアクションにgistのembedをキルリングに追加するアクションを追加
・候補の並び順がこれまで古いものが先頭にきていたのを新しいものが先頭に来るように変更

候補を表示した時にファイル名も出てくるようになったので、だいぶコードを探しやすくなったんではないかと思います。
ちなみに表示はID:filename:descriptionのような順番になってます。
embedのアクションは、ブラウザを操作せずにgistのembedをヤンクできるので、gistをブログなどに貼りつけている方にはかなりおすすめです。
実際はこんな感じで表示されるはずです。

Screenshot

ファイルは当然gistに置いてます。
インストールについては、以前書いたこちらの日記を参考に。
Emacs上でgistを編集して、サクッと更新するためのanything-gist.el

苦情やコメントはここのコメント欄か、@myuheへお気軽にどぞ。

Pythonのヘルプをポップアップしてくれるelisp、py-doc-popupができるまで

秋の夜長、いかがお過ごしでしょうか。こんばんわ、myuhe a.k.a デスマ中にも関わらず、いつの間にかelispをいぢってたりするたわけ者 です。
さて、そのきっかけは、@kozo2さんのたわいもない一言

emacsのPython modeでcompletion-at-pointやった時にvimみたいにdocstringの表示できないんだろうか。Mon Sep 06 14:02:57 via web

これをほけーっと見てて、あー確かにポップアップできるようになったら便利だなーとか思っていたのでした。

んで、お仕事でPython書いてたら、いつの間にかelisp書いてました。
python.elに使えそうな関数があったのでそんなに手間をかけずにできてきたのですが、バッファにPythonのヘルプを実行した結果がなぜか入りません。結局、原因がわからずTL上のelisperのみなさんに助けをこうことに

pythonのドックストリングをカーソル位置でポップアップするelisp書いたんだけど、なせか2回評価しないとポップアップしないとゆーとんでもない粗悪品。。。Wed Sep 29 10:25:56 via KeySnail


というわけでハックしてくださる方、募集中です!! RT @myuhe: 先ほどのPythonのドックストリングをポップアップするelisp。 なぜか2回評価しないとポップアップしないんだけど。。。 “gist: 602537” – http://j.mp/aJ005yWed Sep 29 11:05:39 via KeySnail

すると、ありがたいことに@mori_devさんと@kiwanamiさんからコメントが。

@myuhe 整理するとけっこういいせんまでいけたのですが、comint.. の戻り値を取得できないところで諦めました! http://j.mp/cpU6xGWed Sep 29 13:01:13 via KeySnail


@myuhe comint-redirect〜が非同期の関数のようです。 comint-redirect-filter-functions で表示のイベントを取ってくるか、地味にタイマーでポーリングとかでしょうか。Wed Sep 29 14:17:34 via web


@myuhe gistでforkして100msec待つ簡単な修正をしてみました。ちゃんとするなら、中身が入るまでループして待つとか、filterでイベント拾ってdeferred開始という感じかなと思います。Wed Sep 29 14:26:55 via web

本当にありがとうございます。elispは 1割の括弧と9割の優しさでできているというのは本当なんですね!!
お二人のコードを拝借しながら、どうにか形になりました。kiwanamiさんからはdeferred.el使う必要はないかも、とのことでしたが、せっかく書いていただいたし、deferred.elの使用例としてそのままにしてます。

python.elで定義されている関数を使っているので、Emacs22以降推奨。そうでない場合は自前でインストールする必要があります。
当然deferred.elが必要です。
kiwanami’s emacs-deferred at master – GitHub
ポップアップにはpopup.elを使っているので、こちらも必要です。
m2ym’s auto-complete at master – GitHub
kozo2さんが希望されていたものと、ちょっと(かなり?)違う気もしますが、auto-complete.elに組みこむのだったら、たいした手間はかからないかも。
余裕がでてきたらやってみます。

20101001 20:41追記

deferred.elをdeffered.elとtypoしていたのを修正しました。
kiwanamiさん、ご指摘ありがとうございます。