从asp.net应用程序运行R脚本并从r获取输出

时间:2015-07-08 10:57:52

标签: c# asp.net r

我需要从我的asp.net应用程序运行存储在文件夹中的r脚本,并在网页中显示该r脚本的输出。

下面是我的Default.aspx.cs文件的代码

using RDotNet;   
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    private static double EvaluateExpression(REngine engine, string expression)
    {
        var expressionVector = engine.CreateCharacterVector(new[] { expression });
        engine.SetSymbol("expr", expressionVector);

        //  WRONG -- Need to parse to expression before evaluation
        //var result = engine.Evaluate("eval(expr)");

        //  RIGHT way to do this!!!
        var result = engine.Evaluate("eval(parse(text=expr))");
        var ret = result.AsNumeric().First();

        return ret;
    }

    public static void SetupPath(string Rversion = "R-3.2.1")
    {
        var oldPath = System.Environment.GetEnvironmentVariable("PATH");
        var rPath = System.Environment.Is64BitProcess ?
                               string.Format(@"C:\Program Files\R\{0}\bin\x64", Rversion) :
                               string.Format(@"C:\Program Files\R\{0}\bin\i386", Rversion);

        if (!Directory.Exists(rPath))
            throw new DirectoryNotFoundException(
              string.Format(" R.dll not found in : {0}", rPath));
        var newPath = string.Format("{0}{1}{2}", rPath,
                                     System.IO.Path.PathSeparator, oldPath);
        System.Environment.SetEnvironmentVariable("PATH", newPath);
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        SetupPath();
        REngine.SetEnvironmentVariables();

        REngine engine = REngine.GetInstance();
        // REngine requires explicit initialization.
        // You can set some parameters.
        engine.Initialize();
        string path = Server.MapPath("~/R Script/rscript.r");
        engine.Evaluate("source('" + path + "')");
        Label1.Text = EvaluateExpression(engine, "C").ToString();
    }
}

rscript.R脚本文件具有以下简单的编码

C<-sum(1,2,3,4)

操作是这样一种方式,我有一个按钮,当我点击按钮时,需要执行文件夹中的r脚本,结果值需要显示在我的网页中的标签中。我在web应用程序文件夹中有文件rscript.r并且它被正确拉出。

当我点击按钮时代码被执行而我的Web应用程序抛出错误

  

尝试读取或写入受保护的内存。这通常是一个   表明其他内存已损坏。

enter image description here

我试图谷歌,但这没有帮助。有没有办法直接从asp.net Web应用程序执行r文件并获取执行文件的输出。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

我使用了RScriptRunner并修复了我的解决方案。我为RScriptRunner创建了一个类文件,并在我的按钮单击事件中调用了该函数。

RScriptRunner可以在命令行模式下使用rscript.exe执行r脚本。

但是我无法从r代码中获取输出结果。

答案 1 :(得分:0)

ASP.NET不能很好地使用R.NET,而不是没有解决一些IIS怪癖。与环境变量有关。也就是说,访问冲突异常并不是我所期望的告诉症状。

如果你还没有这样开始,我建议你使用没有ASP.NET甚至桌面用户界面的R.NET代码原型。这可以帮助诊断问题是否特定于IIS。

其次,看看现有的样品: https://github.com/jmp75/rdotnet-onboarding/tree/master/

特别是,在“solutions / WebApp”下有一个解决方案,一个贡献者和我(主要是贡献者)放在一起作为样本。请注意,您可能需要在从Visual Studio运行之前更改PATH env var

IIS不会让您永久更改环境变量。我认为你可以通过改变每个“按钮点击”的路径来解决这个问题。您将在讨论中找到有关IIS的背景信息 https://rdotnet.codeplex.com/discussions/462947,特别是在线程结束时。