2016-07-15 66 views
1

我正在研究使用rpy2將現有R包綁定到Web服務的概念驗證。如果需要解決此問題,我確實有源代碼包。我目前也在Windows上開發,但如果通過使用Linux來解決此問題,那很好,因爲這是我的計劃環境。grDevices保存文件open

對於我在這個POC中的第一點,我試圖捕獲由這個包創建的圖表,並使用Flask將其提供給一個Web請求。完整的代碼:

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'

望着調用堆棧,當它發生TempDirectory()去清理。使用Flask調試器,png變量也是空的。

那麼,如何讓grDevices關閉文件?還是我需要以不同的方式去了解我的POC?

回答

1

rpy2在Windows上不完全受支持,Linux(或OS X)上的工作可能不支持。既然你正在用Flask開發PoC,我鼓勵你嘗試使用Docker(在Windows上使用docker-machine)。你可以使用rpy2的docker鏡像作爲基礎鏡像。

但是,這裏只是使用R函數png()dev.off()所以它「應該」工作。

我有三點建議:


1-

貴 「DO數據科學的東西」 塊作任何[R情節?如果不是,這可以解釋爲什麼你的Python對象png是空的。


2-

如果,使用R的grid系統(例如,通過latticeggplot2)和你正在評估串爲R代碼最好是明確要求R鍵繪製的附圖。例如:

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

而不是

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

3-

嘗試移動return Response(png, "image/png")上下文經理塊之外TemporaryDirectory

+0

整個 「數據做科學的東西」塊調用一個最終調用'plot()','text()','polygon()'和ot的函數她的。在Windows上運行,我確實會彈出圖形窗口。我正在努力讓linux vm爲此設置。這導致了Xvfb的遊覽。 –

+0

不幸的是,我目前沒有Windows版本來嘗試這個。奇怪的是一個Windows彈出。否則,在Linux上,您不需要X11/xorg來繪製R PNG圖形。如果沒有獨立的示例來嘗試嘗試複製問題,很難幫助更多人。 – lgautier

+0

我現在正在linux下運行這個應用程序,它完美的工作。所以我想這只是Windows共享文件vs posix的行爲。 –