2016-07-15 16 views
1

私はrpy2を使って概念証明して、既存のRパッケージをWebサービスに結びつけています。この問題を解決するには、パッケージのソースがあります。私は現在Windows上で開発中ですが、Linuxを使用することでこの問題が解決されれば、それは私の計画された環境なので、うまくいきます。grDevicesファイルを開く

このPOCの最初のポイントは、このパッケージで作成したチャートをキャプチャし、Flaskを使用してWebリクエストまで提供しようとしています。完全なコード:TempDirectory()をクリーンアップするために行くとき

from flask import Flask, Response 
from rpy2.robjects.packages import importr 
import rpy2.robjects as ro 
from tempfile import TemporaryDirectory 
from os import path 

app = Flask(__name__) 

null = ro.r("NULL") 
numeric = ro.r("numeric") 
grdevices = importr("grDevices") 
efm = importr('euroformix') 

@app.route('/') 
def index():  
    table = efm.tableReader('stain.txt') 
    list = efm.sample_tableToList(table) 

    with TemporaryDirectory() as dir_name: 
     print("Working in {0}".format(dir_name)) 
     png_path = path.join(dir_name, "epg_mix.png") 
     print("png path {0}".format(png_path)) 
     grdevices.png(file=png_path, width=512, height=512) 
     # Do Data Science Stuff Here 
     grdevices.dev_off() 

     with open(png_path, 'rb') as f: 
      png = f.read() 
      return Response(png, "image/png") 

if __name__ == '__main__': 
    app.run(debug=True) 

サービスを打つとき、私は、コールスタックを見てみるとバックPermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\matt\\AppData\\Local\\Temp\\tmpgg65cagq\\epg_mix.png'

を取得し、それが起こります。 Flaskデバッガを使用すると、png変数も空です。

したがって、どうすればgrDevicesをファイルにすることができますか?それとも私のPOCについて別の方法で行く必要がありますか?

答えて

1

rpy2は、Windowsでは完全にサポートされておらず、Linux(またはOS X)で動作しているものはそうではありません。 FlaskでPoCを開発しているので、Docker(Windowsではdocker-machine)を試してみることをお勧めします。 rpy2のドッカーイメージをベースイメージとして使用できます。

ただし、ここではR関数png()dev.off()を使用しているため、「うまくいくはず」です。

私は3件の提案があります


の1-

をあなたの "ないデータ・サイエンスのもの" ブロックは、任意のRのプロットを作成していますか?そうでなければ、あなたのPythonオブジェクトpngが空である理由を説明します。


2-

Rのgridシステム(例えば、lattice又はggplot2介して)を使用して、Rコードとして文字列を評価している場合は、明示的図形をプロットするRを依頼することが好ましいです。たとえば、次のように

p <- ggplot(mydata) + geom_point(aes(x=x, y=y)) 
print(p) 

ではなく

ggplot(mydata) + geom_point(aes(x=x, y=y)) 

、3-

TemporaryDirectory

+0

全体の "ないデータ・サイエンス・スタッフ" のコンテキストマネージャブロックの外側にreturn Response(png, "image/png")を移動してみてくださいブロックは最終的に 'plot()'、 'text()'、 'polygon()'およびotを呼び出す関数を呼び出します彼女たち。 Windows上で実行すると、グラフィックスウィンドウがポップアップします。私はLinuxのVMとしてこれを設定するように取り組んでいます。 Xvfbへのエクスカーションにつながっている。 –

+0

残念ながら、私は現在、これを試すWindows版を持っていません。 Windowsがポップアップしているのが不思議です。それ以外の場合、LinuxではR PNGグラフィックをプロットするためにX11/xorgは必要ありません。問題を複製しようとするための自己完結型の例がなくても、より多くのことを支援することは困難です。 – lgautier

+0

私は今、linuxの下でアプリケーションを実行しており、それは完全に動作します。だから私はそれがファイルを共有するWindowsの動作posixとちょうど何かだと思います。 –