如何在Python中使用R通过Django返回R图?

如何在Python中使用R通过Django返回R图?,python,r,django,Python,R,Django,我试图通过Django应用程序运行下面的R代码,最终结果是PythonDjango网页中打印的R图。这是R的代码 t=read.table(file=file("request.FILES['fileUpload']")) colnames(t) <- c('x', 'y') t = data.frame(t) fit1 = lm(y ~ x, data = t) par(mfrow=c(1,1)) plot(x=t$x, y=t$y, xlab="x", ylab="y", main="

我试图通过Django应用程序运行下面的R代码,最终结果是PythonDjango网页中打印的R图。这是R的代码

t=read.table(file=file("request.FILES['fileUpload']"))
colnames(t) <- c('x', 'y')
t = data.frame(t)
fit1 = lm(y ~ x, data = t)
par(mfrow=c(1,1))
plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20)
abline(fit1, col="red")
t=read.table(file=file(“request.FILES['fileUpload']))
colnames(t)
响应=RGraph
返回响应
或
返回呈现(请求'Regression/index.html',{'graph':response})
返回呈现(请求“Regression/index.html”)
HTML代码如下所示

<html>
    <title>Import File</title>
        <body>
            <h1>Import File</h1>
                <hr>
            {% if graph %}
                <img alt="my base64 graph" src="data:image/png;base64,{{graph}}" />
            {% endif %}
            <form enctype="multipart/form-data" method="post">
                {% csrf_token %}
                <input type="file" name="fileUpload" />
                <input type="submit" value="Submit" />
            </form>
        </body>
</html>

导入文件
导入文件

{%if图%} {%endif%} {%csrf_令牌%}
一如既往,谢谢你的帮助

  • 为此,您可以使用中给出的R和Python之间的接口。这允许您在python会话旁边运行R会话,并且能够从python中运行R命令并返回结果

  • 或者,您可以在服务器上以命令行脚本的形式运行R,查看
    Rscript
    以使其正常工作。该脚本可以基于许多输入参数生成png。Python随后可以获取png并将其发送回用户

  • 作为第三种选择,您可以通过
    Rserve
    运行R,并创建到它的连接以完成打印。例如,请参见


  • 解决方案3有点过分,但允许您在不同于Django实例的服务器上使用R。解决方案1。它相当灵活,但更复杂。最后,解决方案2。是最简单的解决方案,但有时缺乏灵活性,特别是在需要R和Python之间进行大量交互的情况下。

    显然rpy2不提供可以将文件对象返回Python的直接函数。因此,我建议:

    1) 设置保存R图像文件的路径
    • settings.py上定义一个变量,用于保存R脚本/图像

      STATIC_R = 'r_plots'
      
    2) 根据您的设置构建模型/表单以处理文件管理
    • 模型

      from django.conf import settings
      
      class RScript(models.Model):
          script = FileField(upload_to=settings.STATIC_R)
      
          @property
          def script_path(self):
              return os.path.basename(self.script.name)
      
    • 请记住(从文档中):FielField.upload\u to:一个本地文件系统路径,将附加到媒体根设置中,以确定url属性的值

    • 形式

      class RScriptForm(forms.ModelForm):
          class Metal:
              model = RScript
              fields = ('script',)
      
    3) 从上传运行代码
    • 接收您的R脚本并保存它

      my_plot_script = '''
          t=read.table(file=file("{path}"))
          colnames(t) <- c('x', 'y')
          t = data.frame(t)
          fit1 = lm(y ~ x, data = t)
          par(mfrow=c(1,1))
          png(filename="{path}.png")
          plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20)
          abline(fit1, col="red")
          dev.off()
      '''
      
      def my_view(request):
          if request.method == 'POST':
              form = RScriptForm(request.POST)
              if form.is_valid():
                  form.save()
                  (...)
      
      my_plot_script=''
      t=read.table(file=file(“{path}”))
      
      colnames(t)如果在R实例中安装.package('magick')
      ,则可以使用
      rpy2
      将图像数据返回到Python,如下所示(我使用了一个更简单的绘图函数):

      从io导入字节io
      将PIL.Image作为图像导入
      将rpy2.robjects作为ro导入
      def main():
      r=ro.r
      r(“”)
      图书馆(“魔法”)
      
      figure抱歉,但这里的问题是什么?我编辑了标题以澄清问题。只需在模板中创建一个
      ,用
      src
      指向
      R
      生成的图形就足够了。但是我如何通过Python创建图形。我现在正在研究rpy2,我发现importr和l出现了错误m函数。你能告诉我如何在代码中执行此操作吗?这个答案对我帮助不大。你能告诉我如何使用我发布的代码执行此操作吗?请并谢谢。好的。给我几分钟:)谢谢你花时间来解决此问题。我在OP.@Poppins586中添加了index.html代码。你能说出R脚本/func中的哪一行是生成要打印的图像的行吗?我不熟悉Rone生成的图,而另一个将线性回归放在图上。这两行是我发布的代码中的最后两行。--plot(x=t$x,y=t$y,xlab=“x”,ylab=“y”,main=“简单线性回归”,xlim=c(0100),ylim=c(0,6),par=20)abline(fit1,col=“红色”)
      my_plot_script = '''
          t=read.table(file=file("{path}"))
          colnames(t) <- c('x', 'y')
          t = data.frame(t)
          fit1 = lm(y ~ x, data = t)
          par(mfrow=c(1,1))
          png(filename="{path}.png")
          plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20)
          abline(fit1, col="red")
          dev.off()
      '''
      
      def my_view(request):
          if request.method == 'POST':
              form = RScriptForm(request.POST)
              if form.is_valid():
                  form.save()
                  (...)
      
      my_plot_script = '''
          t=read.table(file=file("{path}"))
          colnames(t) <- c('x', 'y')
          t = data.frame(t)
          fit1 = lm(y ~ x, data = t)
          par(mfrow=c(1,1))
          png(filename="{path}.png")
          plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20)
          abline(fit1, col="red")
          dev.off()
      '''
      
      def my_view(request):
          context = {}
          if request.method == 'POST':
              form = RScriptForm(request.POST)
              if form.is_valid():
                  form.save()
                  import rpy2.robjects as robjects
                  robjects.r(my_plot_script.format(form.instance.script_path))
                  context['graph'] = form.instance.script_path + '.png'
                  return render(request, 'Regression/graph.html', context)
      
      <html>
          <title>Import File</title>
              <body>
                  <h1>Import File</h1>
                      <hr>
                  {% if graph %}
                      <img alt="my base64 graph" src="{{graph}}" />
                  {% endif %}
                  <form enctype="multipart/form-data" method="post">
                      {% csrf_token %}
                      <input type="file" name="fileUpload" />
                      <input type="submit" value="Submit" />
                  </form>
              </body>
      </html>
      
      from io import BytesIO
      
      import PIL.Image as Image
      import rpy2.robjects as ro
      
      def main():
          r = ro.r
      
          r('''
              library("magick")
              figure <- image_graph(width = 400, height = 400, res = 96)
              plot(c(1,2,3))
              image <- image_write(figure, path = NULL, format = "png")
          ''')
      
          image_data = ro.globalenv['image']
      
          image = Image.open(BytesIO(bytes(image_data)))
      
          return image
      
      
      if __name__ == '__main__':
          image = main()
          image.show()