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の出力が完了するまで待つ関数があればそれが一番なのですがなにぶん使い始めたばかりなのでそういうものがあるのかどうかわかりませんでした。
フィードバック
xlab,ylab にx軸、y軸と指定したら、化けてしまいました。 今、Pyothon-ml-jpにもなげたので、そちらでお願いします(^^)。
藤本