Samstag, 15. November 2014

R mit C# Verbindung

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.
Weitere Software wird nicht benötigt.

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