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;
文章標籤
全站熱搜