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

我需要运行存储在我的asp.net应用程序的文件夹中的ar脚本,并在网页中显示该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应用程序抛出错误

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

在此处输入图像描述

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

谁能帮我吗?

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

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

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

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

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

其次,请查看现有样本: https : //github.com/jmp75/rdotnet-onboarding/tree/master/

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

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