1.前言
使用C#調用R處理資料數據。
2.說明
R是一個強大的統計軟體,利用C#調用R可將複雜的計算交由R,再將統計結果回傳給C#。

本範例的環境為:
OS: Win8 64bit
R: R-3.0.1-win for 32/64 bits
DCOM: statconnDCOM3.5-1B2_Noncommercial
rscproxy: rscproxy_2.0-5

首先安裝R,最新版本軟體下載位置:
http://cran.r-project.org/

DCOM下載位置:
http://sunsite.univie.ac.at/rcom/

rscproxy可在R中下命令安裝
install.packages("rscproxy")

軟體環境設定好後,開啟C#專案,加入參考COM選項,將以下的COM元件加入
StatConnControls
StatConnectorClnt 1.0 Type Library
StatConnectorCommon 1.6 Type Library
StatConnectorSrv 1.3 Type Library
StatConnTools

加入命名空間

using StatConnControls;
using StatConnTools;
using StatConnectorCommonLib;
using STATCONNECTORSRVLib;
using STATCONNECTORCLNTLib;

data frame轉成DataTable方法

private DataTable GetDataTable(string dataFrame)
{
	DataTable dt = new DataTable();
	DataSet ds = new DataSet();
	ds.Tables.Add(dataFrame);
	Array aryColumNames;
	Array aryValue;

	//建立連線
	StatConnector conn = new StatConnectorClass();

	//建立R的實例化
	conn.Init("R");

	//獲取data frame欄位名稱
	string cmdColumnNames = "colnames(" + dataFrame + ")";
	aryColumNames = (Array)conn.Evaluate(cmdColumnNames);

	//建立DataTable欄位名稱
	for (int i = 0; i < aryColumNames.Length; i++)
	{
		if (!ds.Tables[dataFrame].Columns.Contains(aryColumNames.GetValue(i).ToString())) ;
		{
			ds.Tables[dataFrame].Columns.Add(aryColumNames.GetValue(i).ToString().Trim().ToUpper());
		}
	}

	//獲取data frame的row數目
	string cmdNrow = "as.character(nrow(" + dataFrame + "))[1]";
	int nrow = int.Parse(Convert.ToString(conn.Evaluate(cmdNrow)));

	//產生空的row
	for (int i = 0; i < nrow; i++)
	{
		ds.Tables[dataFrame].Rows.Add();
	}

	//填滿每一個row
	for (int i = 0; i < aryColumNames.Length; i++)
	{
		string cmd = dataFrame + "$" + aryColumNames.GetValue(i).ToString();
		aryValue = null;
		aryValue = (Array)conn.Evaluate(cmd);
		for (int j = 0; j < aryValue.Length; j++)
		{
			ds.Tables[dataFrame].Rows[j][aryColumNames.GetValue(i).ToString()] = aryValue.GetValue(j).ToString();
		}
	}

	//關閉連線
	conn.Close();

	//傳回DataTable
	dt = ds.Tables[0];
		
	return dt;
}

3.應用

DataTable dt = GetDataTable("cars");
dataGridView1.DataSource = dt;
arrow
arrow
    文章標籤
    C# R語言 DCOM
    全站熱搜

    西夏普 發表在 痞客邦 留言(3) 人氣()