Я пытаюсь 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?
Похоже, у вас устаревшая версия 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();
are you missing a "\"
в конце этойstring dllPath = @"C:\Program Files\R\R-3.1.0\bin\i386"