Windows Dev. Site

Excel と R via VSTO

RExcelアドインを使ってExcelとR連携は前々回テストしましたが、VSTOを使ってRを呼び出すテストをしてみました。
これには、“C#, Python で R.NET”でテストしたR.NETを使います。
プロジェクトは“LINQ/VSTO”と同じ方法で作成します。

環境: Excel2010, R 3.0.0 / Windows 7
VisualStudio 2010 参照設定追加
RDotNet
RDotNet.NativeLibrary

using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using RDotNet;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelWorkbook3
{
    public partial class Sheet1
    {
        private void InternalStartup()
        {
            DataTable table = new DataTable();
            Excel.Worksheet activeSheet = ((Excel.Worksheet)Application.ActiveSheet);

            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 plotCommmand = new StringBuilder();  
                plotCommmand.Append(@"rnorm(100)");
                var e = engine.Evaluate(plotCommmand.ToString());
                int k = 1;
                foreach (var v in e.AsNumeric().ToArray<double>())
                {
                    activeSheet.Cells[k, 1].Value = v;
                    k++;
                }
            }
        }
    }
}

R側では正規分布の乱数を生成するrnorm関数を使い、その出力をExcelシートに表示させます。Excel側では、グラフ表示をして正規分布を確認しました。(手動)
(ちなみにRのPlotを呼び出すこともできます)
R_VSTO1
このような単純な例では、どんな連携方法も大差ありませんが、その他に組み合わせるものがある場合、いろいろと解決方法を知っておくと便利です。