« Pythonでマウスポインタの位置を取得→その周辺のスクリーンキャプチャ |Main| Pythonでファイルを拡張子ごとのフォルダに整理 »

« Pythonでマウスポインタの位置を取得→その周辺のスクリーンキャプチャ | Python | Pythonでファイルを拡張子ごとのフォルダに整理 »

RPyでplotするとハングアップする問題を回避する方法

RPyを使うとR言語が持つ豊富な統計関数やプロット方法を利用できて便利なのですが、なぜか私の環境ではplotをすると表示されたウィンドウがハングアップします。ファイルに出力するのはハングアップしないようなので、ファイルに出力した後でそれに関連づけられているビューワーで開けば使い勝手はさほど変わらないかと思い実装してみました。

from rpy import r
import os, time

class RPlotWrapper:
    def __init__(self, func, filename = "tmpplot.bmp"):
        self.func = func
        self.filename = filename

    def __call__(self, *args, **kw):
        try:
            os.remove(self.filename)
        except:
            pass
        r.bitmap(self.filename, res=200)
        self.func(*args, **kw)
        r.dev_off()
        while True:
            if os.path.isfile(self.filename):
                os.startfile(self.filename)
                break
            time.sleep(0.1)


if __name__ == "__main__":
    from random import gauss
    data = []
    for i in range(100):
        data.append(gauss(0, 1))

    r.library("KernSmooth")
    plot = RPlotWrapper(r.plot)
    plot(r.bkde(data, bandwidth = r.dpik(data)),
        type = "l", xlab = "", ylab = "")

r.dev_off()でRがグラフをファイルに出力し終わるまで待機すると思ったのですが、実際にはr.dev_off()の直後にファイルを開くと古いファイルが表示されてしまうことがありました。そこで、あらかじめテンポラリファイルを消しておいて、ファイルが作成されたかどうかを判定して開くようにしています。運悪く「ファイルは作成されたがまだ書き込み中」という状態に当たってしまうと表示がされませんが、以前のファイルが表示されてしまうのよりは実害が少ないかと思います。Rの出力が完了するまで待つ関数があればそれが一番なのですがなにぶん使い始めたばかりなのでそういうものがあるのかどうかわかりませんでした。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/26

フィードバック

by 藤本 | 2006年10月02日 22:36

xlab,ylab にx軸、y軸と指定したら、化けてしまいました。 今、Pyothon-ml-jpにもなげたので、そちらでお願いします(^^)。

藤本

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.