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

Nic*_*row 3 python django r

我试图通过我的Django应用程序运行以下R代码,最终结果是在Python Django网页中打印的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")
Run Code Online (Sandbox Code Playgroud)

这是我想在Django函数中实现的东西.

from django.shortcuts import render, HttpResponse
import pandas as pd

def upload_files(request):
    if request.method == 'POST':
        upload = pd.read_table(request.FILES['fileUpload'])
        << Run R Code Here and return the graph >>
        response = RGraph
        return response
             OR
        return render(request, 'Regression/index.html', {'graph':response})
    return render(request, 'Regression/index.html')
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

一如既往,感谢您的帮助.

vys*_*ond 6

显然rpy2不提供可以将文件对象返回给python的直接函数.所以我推荐的是:

1)设置保存R图像文件的路径

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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 记住(来自docs):FielField.upload_to:一个本地文件系统路径,它将附加到MEDIA_ROOT设置以确定url属性的值.

  • 形成

    class RScriptForm(forms.ModelForm):
        class Metal:
            model = RScript
            fields = ('script',)
    
    Run Code Online (Sandbox Code Playgroud)

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()
                (...)
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在我们已经保存了脚本,让我们尝试使用rpy2运行它

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 在你的模板上

    <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>
    
    Run Code Online (Sandbox Code Playgroud)


Pau*_*tra 3

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

  2. 或者,您可以在服务器上将 R 作为命令行脚本运行,请查看Rscript以使其正常工作。该脚本可以根据多个输入参数生成一个 png。然后,Python 可以获取该 png 并将其发送回用户。

  3. 作为第三种选择,您可以通过运行 R Rserve,并创建与其的连接以完成绘图。例如参见这里

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