1

我正在尝试使用RDotNet.

下面的代码是希望 R 计算两个数字的总和,C# 来获取结果并将其显示在命令窗口中。

using System;
using RDotNet;

namespace rcon
{
class Program
{
    static void Main(string[] args)
    {
        string dllPath = @"C:\Program Files\R\R-3.1.0\bin\i386";

        REngine.SetDllDirectory(dllPath);
        REngine.CreateInstance("RDotNet");

        //REngine engine = REngine.GetInstanceFromID("RDotNet");

        using (REngine engine = REngine.GetInstanceFromID("RDotNet"))
        {
            var x = engine.Evaluate("x <- 1 + 2");
            Console.WriteLine(x);
        }
    }
}
}

但是当我尝试将命令发送到 R 并取回 x 中的值时,我得到了一个错误:

“InvalidOperationException 未处理”

“由于对象的当前状态,操作无效。”

如果我探索对象“引擎”,我会看到IsRunning=false

这可能是问题吗?我该如何解决这个问题才能与 R 接口?

4

1 回答 1

4

看起来你有过时的 R.NET 版本。

来自R.NET 项目文档

R.NET 1.5.10 及后续版本包括重大更改,特别是为了缓解用户经常遇到的两个绊脚石:R 共享库的路径,以及防止多个引擎初始化。

您可以使用 Visual Studio 中的 NuGet 管理器更新您的 R.NET。有关详细信息,请参阅相同的文档页面。

这是来自同一文档页面的代码示例 - 请注意,现在的初始化REngine要简单得多(因为现在 Rengine 查看 R 安装程序设置的注册表设置):

REngine.SetEnvironmentVariables(); // <-- May be omitted; the next line would call it.
REngine engine = REngine.GetInstance();
// A somewhat contrived but customary Hello World:
CharacterVector charVec = engine.CreateCharacterVector(new[] { "Hello, R world!, .NET speaking" });
engine.SetSymbol("greetings", charVec);
engine.Evaluate("str(greetings)"); // print out in the console
string[] a = engine.Evaluate("'Hi there .NET, from the R engine'").AsCharacter().ToArray();
Console.WriteLine("R answered: '{0}'", a[0]);
Console.WriteLine("Press any key to exit the program");
Console.ReadKey();
engine.Dispose();
于 2014-10-03T14:26:48.170 回答