在asp.net Web应用程序中使用R

3

我想在一个asp.net c#的网页应用程序中使用R脚本。我正在尝试使用一个简单的R脚本,将两个字符串连接成一个。

以下是我的C#代码:

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();
        //engine.Evaluate("G<-5+3+2");
        engine.Evaluate("G<-paste('hello from r', 'Test')");
        Label1.Text = EvaluateExpression(engine, "G").ToString();
    }
}

我有一个点击按钮,当我点击它时,希望输出显示在网页上。

当我运行代码并单击按钮时,标签控件页面中显示的文本为

NaN

然而,当我运行

engine.Evaluate("G<-5+3+2"); 

替代
engine.Evaluate("G<-paste('hello from r', 'Test')");

我在页面标签中正确获取到了数值10。但是我不知道如何将输出显示在网页上,也不知道这个错误是什么。我尝试在一些网站上寻求帮助,但是所有的代码都是针对控制台应用程序编写的,没有针对asp.net web应用程序的代码。请问有人能帮我解决问题并在我的网页上显示输出结果吗?

我也尝试使用以下方式创建实例 using (REngine engine = REngine.CreateInstance("RDotNet")) { engine.Initialize(); 但是我在REngine.CreateInstance处出现了错误,提示无法识别创建实例。 - Karthik Venkatraman
1个回答

3

您根本不需要使用EvaluateExpression,而应该使用engine.GetSymbol("G")

您得到NaN输出的原因是由于EvaluateExpression内部的AsNumeric()转换。它只能适用于数字输出,而不是字符输出。

这里有一个最简单的数值和字符变量示例:

    static void Main(string[] args)
    {
        REngine.SetEnvironmentVariables();
        REngine engine = REngine.GetInstance();
        engine.Initialize();
        engine.Evaluate("x <- 40 + 2");
        engine.Evaluate("s <- paste('hello', letters[5])");
        var x = engine.GetSymbol("x").AsNumeric().First();
        var s = engine.GetSymbol("s").AsCharacter().First();
        Console.WriteLine(x);
        Console.WriteLine(s);
    }

你好,我按照你建议的方式尝试了下面的代码:engine.Evaluate("C<-paste('hello from r', 'Test')").AsSymbol(); Label1.Text = engine.GetSymbol("C").ToString(); 但是我仍然收到了RDotNet.SymbolicExpression错误。 - Karthik Venkatraman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接