2017/12/31
R.NETを使う(1)
今年最後のブログです。あと数時間で年が明けますが、忙しい1年でした。ブログのアップ件数が昨年に比べ減少してしまったのも、そのせいかもしれません。さて、データ解析でRを使うことがあり、システムとしてRをどのように組み込んで行ったら良いのかを考えていました。個人的にはR Studioを普段使って様々な解析を行っていますが、ユーザに使ってもらうにはどのように実装すればいいのでしょうか?
ネット上で調べていると、R.NETという.NET系のパッケージを見つけました。手っ取り早い感じがしましたので、味見をしてみました。他にはDLLの関数を動的に読む方法があるようですが、これは後日調べてみようと思います。
OpenCVで.NET系(C#)でコーディングしたい時はOpenCvSharpを使っていた時もありましたが、関数の使い方が微妙に異なっていたので、最終的にC++/CLIでフォームアプリに走ったこともありました。今回は、どちらに転ぶやら・・。
手順は、このサイトを全面的に参考にしました。ありがとうございました。
C#のフォームアプリの新規プロジェクトを作成し、ソリューションエクスプローラでプロジェクトを選択し、右クリックして「NuGetパッケージの管理」を選択します。




プログラムは、y=x2 (x=1,2,3,...,10)をプロットしたもので、Graphボタンを押すと、Rでグラフ描画し、pngファイル保存して、pictureBoxに表示させるものです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RDotNet;
namespace R_Interface
{
public partial class Form1 : Form
{
private string imgPath = @"c:\\temp\\RDotnet.png";
private REngine re;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
REngine.SetEnvironmentVariables();
re = REngine.GetInstance();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
re.Dispose();
}
private void DrawPicture()
{
using (System.IO.StreamReader str = new System.IO.StreamReader(imgPath))
{
this.pictureBox1.Image = new Bitmap(str.BaseStream);
str.Close();
}
this.pictureBox1.Invalidate();
}
private void Graph_btn_Click(object sender, EventArgs e)
{
var x = re.Evaluate("x <- 1:10").AsNumeric();
var y = re.Evaluate("y <- x*x").AsNumeric();
re.Evaluate(String.Format("png('{0}', width={1}, height={2}, bg='transparent');", imgPath, pictureBox1.Width, pictureBox1.Height));
re.Evaluate("plot(x, y, type='b')");
re.Evaluate("graphics.off();");
DrawPicture();
}
}
}
