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

請問 dcom是要付費的嗎? 因為我找不到dcom的下載位置
您好, 可以到http://rcom.univie.ac.at下載非商用版, einboch
您好, 想請問, R裡有很多package(例如 ggplot). C# 有辦法使用R的那些package嗎?
您好, C#不能直接使用ggplot2哦!需要在R中先安裝好ggplot2的package,然後寫一個腳本。 例如 1.命名一個腳本程式為test.r 內容為 library(ggplot2) myFun<-function() {...} 2.利用C#的System.Diagnostics.Process.Start()方法執行該腳本 einboch
你好,我是一位金融系的學生,之前用R語言寫了一個程式裡面有調用到一些機器學習的套件,我目前想用C#做介面然後C#控制執行之前寫好的R語言程式,然後再將R語言執行完的結果傳回c#介面,請問這樣是否可行? 又該如何實現? 因為R語言本身沒有能做成UI的相關套件。
您好: 以下的程式碼可以使用Rscript來調用R的腳本,並將結果回傳到C#的介面,可以自行測試一下哦! rtest.r內容 1:10 mean(1:100) 程式碼範例: Process proc = new Process(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.StartInfo.FileName = @"C:\Program Files\R\R-3.0.2\bind\Rscript.exe "; proc.StartInfo.Arguments = @"d:\tmp\rtest.r"; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string txt = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); richTextBox1.Text = txt; 西夏普