我试图通过我的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)
一如既往,感谢您的帮助.
显然rpy2不提供可以将文件对象返回给python的直接函数.所以我推荐的是:
在settings.py上定义一个变量,用于保存R脚本/图像
STATIC_R = 'r_plots'
Run Code Online (Sandbox Code Playgroud)模型
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)接收您的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)为此,您可以使用RPy2` python 包中给出的 R 和 Python 之间的接口。这允许您在 python 会话旁边运行 R 会话,并且能够从 python 中运行 R 命令并返回结果。
或者,您可以在服务器上将 R 作为命令行脚本运行,请查看Rscript以使其正常工作。该脚本可以根据多个输入参数生成一个 png。然后,Python 可以获取该 png 并将其发送回用户。
作为第三种选择,您可以通过运行 R Rserve,并创建与其的连接以完成绘图。例如参见这里。
解决方案 3 有点矫枉过正,但允许您在 Django 实例之外的不同服务器上使用 R。解决方案1.相当灵活,但更复杂。最后,解决方案 2. 是最简单的解决方案,但有时缺乏灵活性,特别是在 R 和 Python 之间需要大量交互的情况下。