2016-07-15 54 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的行为。 –