c#調用R語言(原創翻譯)

來源:互聯網
上載者:User

標籤:

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語言(原創翻譯)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.