crossframe » R http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 Excel と R via VSTO ../../../20131013539/ ../../../20131013539/#comments Sun, 13 Oct 2013 07:35:47 +0000 http://xfra.me/?p=539 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
このような単純な例では、どんな連携方法も大差ありませんが、その他に組み合わせるものがある場合、いろいろと解決方法を知っておくと便利です。

]]>
../../../20131013539/feed/ 0
Excel と R ../../../20131011514/ ../../../20131011514/#comments Fri, 11 Oct 2013 14:55:06 +0000 http://xfra.me/?p=514 前回に引き続きExcelと外部ツールの連携についての調査で、フリーの統計解析ツールとして有名なRを試してみました。
Rは以前R.NETの話題で投稿しましたが、とても強力なツールで時々使用しています。解析という点では、Excelだけで十分なことも多いのですが、作業環境といった点で使い分けるメリットは大きいと思っています。
連携ツールには、RExcelというアドインを使いました。

環境 : R version 3.0.0, Excel 2010 / Windows 7

1) 以下をインストールします
RExcel_3.2.13
statconnDCOM3.5-1B2_Noncommercial

2) Rでは、
rscproxy
rcom
をインストールします

http://rcom.univie.ac.at/download.html

3) ExcelのオプションからアドインRExcel2007を組み込みます
使用するExcelは2010ですが、これでも動作しました。(たまにエラーがでて不安定な気もしますが、一応動いています)

参考) http://d.hatena.ne.jp/Rion778/20091012/1255362015

これで、プレゼンテーションはExcel、バックグランドはRといった使い分けをした例をつくってみました。
RExcel5
RExcel7
テストの意図は、データスライダーでデータの分布をリアルタイムに変更させたものをRでデータと回帰分析結果をグラフ表示するといったものです。
回帰分析自体はExcelだけでもできますが、わかりやすい例ということでRでやってみました。
興味深い点は、以下のRのソースをエクセルで記述して、範囲指定して関数定義できます。それをRApply関数を通して実行できます。

function(x,y,L){
  xy <- data.frame(x=x,y=y)
  xy.lm <- lm(x~y,data=xy)
  plot(x, type="l",xlim=c(0,16),ylim=c(0,L),col="green",lwd=1)
  par(new=T)
  plot(y, xlim=c(0,16), ylim=c(0,L), col="red", pch=3)
  abline(xy.lm, col="blue", lwd=2)
}

これも含めて、いくつかのわかりやすいデモが用意されています。
RMenu1
今回はわざわざスライダーやブロットという見た目わかりやすいものを使いましたが、ExcelシートのデータをRにデータフレームという形で渡し、Rで演算した結果を地味にExcelに戻すというのは使えるのではと思いました。
RではExcelにないライブラリを使えるのも魅力ですが、Matlabのようにマトリックス演算を使って自前でいろいろプログラミングできるのは面白そうです。
最近このジャンルには、いろんな可能性を感じているため鋭意調査・勉強中ですが、やりたいことがたくさんあるのに時間が不足している状況です。少しづづ整理して、またまとめていきたいと思っています。

しかしながら、ExcelとRの書籍を比べてみると、Excelはカラーで数も多く価格も安い反面Rはそれとは逆の傾向にありますね。当然といえば当然ですが、通常の業務を考えてみてもExcelの普及率、利用率の高さにはとても驚かされる次第です。(仕様書読んだり作成したりとか多いですが・・)

]]>
../../../20131011514/feed/ 0
C#, Python で R.NET ../../../20130630322/ ../../../20130630322/#comments Sun, 30 Jun 2013 06:28:29 +0000 http://xfra.me/?p=322 最近の統計ブームにのって私もいろいろと興味があったので、「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でやる方法はまた調べたいと思います。

]]>
../../../20130630322/feed/ 0