Eine Verbindung zwischen C# und R herstellen.
An dieser Stelle möchte ich kurz meinen Lösungsweg beschreiben, wie man die Kommunikation zwischen R und C# herstellt. Ich habe dazu das Projekt R.NET benutzt. Zu beachten sind vorallem die unterschiedlichen Version die benutzt werden.
Alle Beispiele wurden auf einem Windows 7 64Bit in einer virtuellen Maschine getestet.Benötigte Installationen
- 1. R-Project Unter http://cran.rstudio.com/ findet ihr die aktuelle Version von R. Ich habe die Version R-3.1.2 installiert. Die Einstellungen beim installieren müssen nicht verändert werden. Ich habe beide Version 32Bit und 64Bit installiert.
- 2. R.NET R.NET kann von http://rdotnet.codeplex.com/ heruntergeladen werden. Da ich Probleme mit der NUGET Version hatte, habe ich die Sources vom Commit rdotnet-e0329307d844 benutzt. Die darin enthaltenen Projekte RDotNet und RDotNet.NativeLibrary können dann später in der Projektmappe benutzt werden.
Verwendung
Projekt erstellen und R.NET-Projekte hinzufügen.
Als erstes muss ein neues C# Projekt erstellt werden. Anschließend werden die beiden Projekte RDotNet und RDotNet.NativeLibrary der neuen Projektmappe hinzugefügt. Rechtsklick auf die Projektmappe -> Hinzufügen -> Vorhandenes Projekt... und dann die csproj der beiden Projekte auswählen. Danach sollte die Projektmappe in etwa so aussehen:Verweise hinzufügen
Nun muss das neue Projekt nur noch die entsprechenden Verweise auf die RDotNet Projekte erhalten. Rechtsklick auf das Projekt -> Hinzufügen -> Verweis -> Projekte und dann beide Projekte auswählen.Der Quelltext
Nun ist alles vorbereitet. Als erstes erhält die Klasse in der R benutzt werden soll einen entsprechenden Verweis auf das RDotNet Projekt.using RDotNet;Als nächstes muss die EnvironmentVariable R_HOME gesetzt und die PATH Variable angepasst werden.
//R_HOME
Environment.SetEnvironmentVariable("R_HOME", "C:\\Program Files\\R\\R-3.1.2");
//PATH
Environment.SetEnvironmentVariable("PATH", System.Environment.GetEnvironmentVariable("PATH")+ ";" + @"C:\Program Files\R\R-3.1.2\bin\i386");
Die Variable R_HOME zeigt auf das Hauptverzeichnis der R Installation, vohingegen die PATH Variable auf das Verzeichnis der R.exe zeigen muss.
Auch hier gilt es zu beachten, dass die Versionen übereinstimmen.
Um nun eine Instanz von R zu erhalten, benutzen wir die Funktion GetInstance von der REngine.
REngine engine = REngine.GetInstance();engine enhält nun eine Instanz von R mit der sich arbeiten lässt.
Funktionstest
Um sicher zu gehen, dass alles erfolgreich war, empfiehlt es sich das Beispiel aus der R.NET dokumentation kurz anzuwenden
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");
engine.Dispose();
Das sollte folgende Ausgabe auf der Console erzeugen:
chr"Hello, R world!, .NET speaking" [1]"Hi there .NET, from the R engine" R answered: 'Hi there .NET, from the R engine' Press any key to exit the program
Keine Kommentare:
Kommentar veröffentlichen