Windows Dev. Site

C#, Python で R.NET

最近の統計ブームにのって私もいろいろと興味があったので、「R」という統計ソフトを使ってみました。制御系の仕事をしていたときMatlabというシミュレーションソフトを使っていましたが、行列とかが簡単に扱えるインタープリタにとても驚かされました。とても魅力的なソフトなのですがとても高価なため個人では手軽に使えるものではありませんでした。Rのインタプリタを使っていると、そのときの感動がよみがえってきました。
調べてみるとRDotNet(http://rdotnet.codeplex.com/)を使うと、C#からRの機能が使えるということなので、いろいろとテストをしてみました。

環境: R 3.0.0, VisualStudio 2010/ Windows 7

using System;
using System.IO;
using System.Linq;
using RDotNet;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        var envPath = Environment.GetEnvironmentVariable("PATH");
        var rBinPath = @"C:\Program Files\R\R-3.0.0\bin\i386";
        Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
        using (REngine engine = REngine.CreateInstance("RDotNet"))
        {
            engine.Initialize();

            StringBuilder command = new StringBuilder();
            commmand.Append(@"x <- 1:10;");
            commmand.Append(@"plot(x);");
            engine.Evaluate(commmand.ToString());
            Console.ReadLine();
        }
    }
}

まず、Rのコマンドラインで試した簡単なプロットをC#からやってみました。しかしこのやり方だと、単にリモート実行しているだけなのであまり意味がないと思い、以下のように修正しました。

class Program
{
    static void Main(string[] args)
    {
        var envPath = Environment.GetEnvironmentVariable("PATH");
        var rBinPath = @"C:\Program Files\R\R-3.0.0\bin\i386";
        Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
        using (REngine engine = REngine.CreateInstance("RDotNet"))
        {
            engine.Initialize();

            NumericVector nn = engine.CreateNumericVector(new double[] {1,2,3,4,5,6,7,8,9,10});
            engine.SetSymbol("nn", nn);
            engine.Evaluate("plot(nn)");

            Console.ReadLine();
        }
    }
}

こういったのは、スクリプト言語からの方が使い勝手がいいと思い、.NETでもあるのでIronPythonから呼び出してみようとトライしました。しかしモジュールをうまく読み込んでくれなかったので、普通のPythonに変更しました。しかしこれも、rpy2モジュールが64bitの環境でうまくインストールできなかったので、最終的にMacでテストしました。

sudo pip install rpy2

で簡単にインストールできました。

環境 : R 3.0.1, Python 2.7.1 / MacOSX 10.7.5

import rpy2.robjects as ro
import time

r = ro.r
q = r.seq(0,10);
r.plot(q);

time.sleep(3);

実行結果は以下のプロット画面です。この画面の実行はWindowsのRで行ったものです。

R

IronPythonでやる方法はまた調べたいと思います。