C # не подключается к R с помощью RDotNet

1

Я пытаюсь RDotNet С# с R, используя RDotNet.

Следующий код хочет, чтобы R вычислил сумму двух чисел и С#, чтобы вернуть результат и отобразить его в окне команд.

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?

  • 0
    are you missing a "\" в конце этой string dllPath = @"C:\Program Files\R\R-3.1.0\bin\i386"
Теги:
interface
com
rdotnet

1 ответ

3
Лучший ответ

Похоже, у вас устаревшая версия R.NET.

Из проектной документации R.NET

R.NET 1.5.10 и последующие версии включают значительные изменения, в частности, для облегчения использования двух блоков преткновения, которые часто обрабатываются пользователями: пути к общей библиотеке R и предотвращение нескольких инициализаций движков.

Вы можете обновить свой файл R.NET с помощью диспетчера NuGet из Visual Studio. См. Ту же страницу документации для отдельных статей.

Вот пример кода с той же самой страницы документата - обратите внимание, что инициализация 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню