標籤:
R.NET使用文檔介紹
本頁面涉及R.NET1.5.13。 1.5.13版本在功能上等同於1.5.12,但可作為一個包在NuGet.org上獲得。
R.NET使.NET架構與R統計語言在同一進程進行互操作。 R.NET需要.NET Framework 4的並有R環境中安裝的本地的DLL。您可以使用R.NET用在.NET的任何語言(它已被用於至少C#,F#,Vb.NET,IronPython中)。你使用這個文檔之前有幾個相關的事項都必須被提及。對於F#,你應該考慮F# - [R供應商。一個動機釋放1.5.13對於RProvider更輕鬆地管理R.NET依賴。
入門
這個網頁主要介紹R.NET是眾所周知的跨平台運行。
作為1.5.10版本,R.NET二進位檔案是平台無關的。您可能需要設定一些Linux發行版的小附加的解決方案(CentOS的是已知的),但你可以使用的。R.NET二進位檔案來移動和跨平台。
Visual Studio中
如果您正在使用從zip檔案分發二進位檔案,解壓縮檔案和內容複寫到您選擇的位置。添加項目引用到RDotNet.dll和RDotNet.Native.dll“通常”的方式。
NuGet是首選的方式來管理R.NET依賴性。如果您正在使用的NuGet包:
首先,您必須安裝,如果你有沒有準備好,通過工具的的NuGet包管理器 - 擴充和更新:
Visual Studio中
如果您正在使用從zip檔案分發二進位檔案,解壓縮檔案和內容複寫到您選擇的位置。添加項目引用到RDotNet.dll和RDotNet.Native.dll“通常”的方式。
的NuGet是首選的方式來管理R.NET依賴性。
如果您正在使用的NuGet包:
首先,您必須安裝,如果你有沒有準備好,通過工具的的NuGet包管理器 - 擴充和更新:
您可以添加R.NET包作為一個依賴於一個或多重專案在您的解決方案。對於一個項目:
請注意,你或許應該卸載軟體包的依賴或R.NET1.5.5或更早的版本,如果預先存在的。
R.NET1.5.13使用不同的封裝標識:R.NET.Community。請務必使用搜尋R.NET上的NuGet最近條目:
該系統的NuGet然後增加了一些依賴。
您可以一氣呵成的解決方案層級管理的幾個項目:
你可以找到有關的NuGet在文檔的NuGet更一般的資訊
http://docs.nuget.org/
入門編碼
R.NET1.5.10及以後的版本包括顯著明顯的變化,以緩解2塊絆腳石,處理方式往往是由使用者處理:路徑與R共用庫,並防止發動機多初始化。
下面的“Hello World”樣本說明了如何使用新的API為90%的在Windows表單上使用的情況下更簡單:
static void Main(string[] args){ REngine.SetEnvironmentVariables(); // <-- May be omitted; the next line would call it. REngine engine = REngine.GetInstance(); // A somewhat contrived but customary Hello World: CharacterVector charVec = engine.CreateCharacterVector(new[] { "Hello, R world!, .NET speaking" }); engine.SetSymbol("greetings", charVec); engine.Evaluate("str(greetings)"); // print out in the console string[] a = engine.Evaluate("‘Hi there .NET, from the R engine‘").AsCharacter().ToArray(); Console.WriteLine("R answered: ‘{0}‘", a[0]); Console.WriteLine("Press any key to exit the program"); Console.ReadKey(); engine.Dispose();}
您檢索單個REngine對象執行個體,設定必要的環境變數之後。甚至調用SetEnvironmentVariables可以省略,但我們會建議你把它明確。 SetEnvironmentVariables,在Windows上,著眼於建立是R安裝程式的註冊表設定。如果需要,您可以覆蓋行為設定環境變數和發動機初始化用自己的方式,在附錄中詳細說明。
範例程式碼
你通常與REngine對象互動的方法是Evaluate,GetSymbol和SetSymbol。建立R向量和矩陣,所述REngine對象具有擴充方法如CreateNumericVector,CreateCharacterMatrix等。最後,可以以各種方式調用R裡面的函數,使用Evaluate方法執行REngine對象,並且還更直接。
基本的例子採用t-test統計
它是可從範例程式碼在:https://github.com/jmp75/rdotnet-onboarding擷取。
static void Main(string[] args) { REngine.SetEnvironmentVariables(); REngine engine = REngine.GetInstance(); // REngine requires explicit initialization. // You can set some parameters. engine.Initialize(); // .NET Framework array to R vector. NumericVector group1 = engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 }); engine.SetSymbol("group1", group1); // Direct parsing from R script. NumericVector group2 = engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric(); // Test difference of mean and get the P-value. GenericVector testResult = engine.Evaluate("t.test(group1, group2)").AsList(); double p = testResult["p.value"].AsNumeric().First(); Console.WriteLine("Group1: [{0}]", string.Join(", ", group1)); Console.WriteLine("Group2: [{0}]", string.Join(", ", group2)); Console.WriteLine("P-value = {0:0.000}", p); // you should always dispose of the REngine properly. // After disposing of the engine, you cannot reinitialize nor reuse it engine.Dispose(); }
數字向量
下面的程式碼範例說明了最常用的功能。它是從樣本代碼2萃取在https://github.com/jmp75/rdotnet-onboarding,這個例子說明了數值向量的基本操作。
var e = engine.Evaluate("x <- 3");// You can now access x defined in the R environmentNumericVector x = engine.GetSymbol("x").AsNumeric();engine.Evaluate("y <- 1:10");NumericVector y = engine.GetSymbol("y").AsNumeric();
調用R裡面的函數
雖然你可以通過產生字串並用Evaluate函數調用,並調用Evaluate方法,這可能是笨拙的,因為你傳遞大量資料。下面示範了如何可以調用一個函數,有點像你會如何映射在.NET中並調用一個函數。
// Invoking functions; Previously you may have needed custom function definitionsvar myFunc = engine.Evaluate("function(x, y) { expand.grid(x=x, y=y) }").AsFunction();var v1 = engine.CreateIntegerVector(new[] { 1, 2, 3 });var v2 = engine.CreateCharacterVector(new[] { "a", "b", "c" });var df = myFunc.Invoke(new SymbolicExpression[] { v1, v2 }).AsDataFrame();
R.NET1.5.10包含了許多改進,以支援直接調用函數從C#,用更少的字串操作,少REngine.Evaluate溝通。
// As of R.NET 1.5.10, more function call syntaxes are supported.var expandGrid = engine.Evaluate("expand.grid").AsFunction();var d = new Dictionary<string, SymbolicExpression>();d["x"] = v1;d["y"] = v2;df = expandGrid.Invoke(d).AsDataFrame();
我們使用expand.grid的結果繼續進行,將下面的代碼說明,雖然R.NET試圖模仿R的行為來對應資料集。資料集為R的資料結構的核心部分,所以值得擴充,下面幾個例子:
engine.SetSymbol("cases", df);// As of R.NET 1.5.10, factor to character expressions work consistently with Rvar letterCases = engine.Evaluate("cases[,‘y‘]").AsCharacter().ToArray();// "a","a","a","b","b","b", etc. Same as as.character(cases[,‘y‘]) in R// Note that this used to return "1", "1", "1", "2", "2", etc. with R.NET 1.5.5
還有其他的方法來提取資料集的列,而不通過R運算式字串:
// Equivalent:letterCases = df[1].AsCharacter().ToArray();letterCases = df["y"].AsCharacter().ToArray();
2維索引返回的行為通常直接反映了R.。唯一的例外是行名失蹤,R的行為是值得商榷的,所以R.NET喜歡嚴格。
// Accessing items by two dimensional indexingstring s = (string)df[1, 1]; // "a"s = (string)df[3, 1]; // "a"s = (string)df[3, "y"]; // "b"// s = (string)df["4", "y"]; // fails because there are no row namesdf[3, "y"] = "a";s = (string)df[3, "y"]; // "a"df[3, "y"] = "d";s = (string)df[3, "y"]; // null, because we have an <NA> string in R
調用R指令碼
要重用整個指令碼,最簡單的方法是使用R中的“sourece”方法
engine.Evaluate("source(‘c:/src/path/to/myscript.r‘)");
遺漏值
預留位置,展示了不同各種向量類型NA值的相互互動轉換情況,在後面的頁面中能找到資料類型部分的詳細介紹。
進一步的例子
縱觀根據項目RDotNet.Tests單元測試將提供R.NET用途和編程成語的進一步資訊。展示出的資料轉送的速度。
運行時效能
預留位置,顯示出最佳做法,以最大限度地提高運行速度
其他例子還記錄
預留位置
處理的日期和時間
資料類型
R中的所有運算式都表示為Symbolic Expression對象在R.NET對象中。對於資料訪問,下面有特殊類定義。請注意,“NA”在R特殊值值用於某些類型在這裡沒有直接等同於.NET中的對象,但要注意這種行為,以免風險計算不正確。
表如下。如下R.NET類構成了R和.NET架構之間的橋樑。
R |
R.NET |
.NET Framework |
Note |
character vector |
RDotNet.CharacterVector |
System.String[] |
|
integer vector |
RDotNet.IntegerVector |
System.Int32[] |
The minimum value in R is -2^31+1 while that of .NET Framework is -2^31. Missing values are int.MinValue |
real vector |
RDotNet.NumericVector |
System.Double[] |
Missing values are represented as double.NaN |
complex vector |
RDotNet.ComplexVector |
System.Numerics.Complex[] |
System.Numerics assembly is required for .NET Framework 4. |
raw vector |
RDotNet.RawVector |
System.Byte[] |
|
logical vector |
RDotNet.LogicalVector |
System.Boolean[] |
|
character matrix |
RDotNet.CharacterMatrix |
System.String[, ] |
|
integer matrix |
RDotNet.IntegerMatrix |
System.Int32[, ] |
The minimum value in R is -2^31+1 while that of .NET Framework is -2^31. |
real matrix |
RDotNet.NumericMatrix |
System.Double[, ] |
|
complex matrix |
RDotNet.ComplexMatrix |
System.Numerics.Complex[, ] |
Reference to System.Numerics assembly is required. |
raw matrix |
RDotNet.RawMatrix |
System.Byte[, ] |
|
logical matrix |
RDotNet.LogicalMatrix |
System.Boolean[, ] |
|
list |
RDotNet.GenericVector |
|
From version 1.1. |
data frame |
RDotNet.GenericVector |
|
From version 1.1. RDotNet.DataFrame class is also available (below). |
data frame |
RDotNet.DataFrame |
|
From version 1.3. And from version 1.5.3, DataFrameRowAttribute and DataFrameColumnAttribute are available for data mapping. |
function |
RDotNet.Function |
|
From version 1.4. Including closure, built-in function, and special function. |
factor |
RDotNet.Factor |
System.Int32[] |
From version 1.5.2. |
S4 |
RDotNet.S4Object |
|
Not Available Yet. See S4 branch in the source control. |
demo1
http://rdotnet.codeplex.com/wikipage?title=Examples&referringTitle=Home
demo2
http://dynamicdatadisplay.codeplex.com/
c#調用R語言(原創翻譯)