本页面涉及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二进制文件来移动和跨平台。
如果您正在使用从zip文件分发二进制文件,解压缩文件和内容复制到您选择的位置。添加项目引用到RDotNet.dll和RDotNet.Native.dll“通常”的方式。
首先,您必须安装,如果你有没有准备好,通过工具的的NuGet包管理器 - 扩展和更新:
如果您正在使用从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窗体上使用的情况下更简单:
<code class="hljs http has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="avrasm" style="box-sizing: border-box;">static void Main(string[] args) { REngine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.SetEnvironmentVariables</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // <-- May be omitted; the next line would call it.</span> REngine engine = REngine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.GetInstance</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // A somewhat contrived but customary Hello World: CharacterVector charVec = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CreateCharacterVector</span>(new[] { <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello, R world!, .NET speaking"</span> })<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.SetSymbol</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"greetings"</span>, charVec)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"str(greetings)"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // print out in the console</span> string[] a = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"'Hi there .NET, from the R engine'"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsCharacter</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ToArray</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WriteLine</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"R answered: '{0}'"</span>, a[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>])<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WriteLine</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Press any key to exit the program"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ReadKey</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Dispose</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>
您检索单个REngine对象实例,设置必要的环境变量之后。甚至调用SetEnvironmentVariables可以省略,但我们会建议你把它明确。 SetEnvironmentVariables,在Windows上,着眼于建立是R安装程序的注册表设置。如果需要,您可以覆盖行为设置环境变量和发动机初始化用自己的方式,在附录中详细说明。
你通常与REngine对象交互的方法是Evaluate,GetSymbol和SetSymbol。创建R向量和矩阵,所述REngine对象具有扩展方法如CreateNumericVector,CreateCharacterMatrix等。最后,可以以各种方式调用R里面的函数,使用Evaluate方法执行REngine对象,并且还更直接。
基本的例子采用t-test统计
它是可从示例代码在:https://github.com/jmp75/rdotnet-onboarding获取。
<code class="hljs http has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="avrasm" style="box-sizing: border-box;"> static void Main(string[] args) { REngine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.SetEnvironmentVariables</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> REngine engine = REngine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.GetInstance</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // REngine requires explicit initialization. // You can <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span> some parameters. engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Initialize</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.NET</span> Framework array to R vector. NumericVector group1 = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CreateNumericVector</span>(new double[] { <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30.02</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">29.99</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30.11</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">29.97</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30.01</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">29.99</span> })<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.SetSymbol</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"group1"</span>, group1)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // Direct parsing from R script. NumericVector group2 = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsNumeric</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // Test difference of mean <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> get the P-value. GenericVector testResult = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"t.test(group1, group2)"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsList</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> double p = testResult[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p.value"</span>]<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsNumeric</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.First</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WriteLine</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Group1: [{0}]"</span>, string<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Join</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>, group1))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WriteLine</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Group2: [{0}]"</span>, string<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Join</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>, group2))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Console<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WriteLine</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"P-value = {0:0.000}"</span>, p)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> // you should always dispose of the REngine properly. // After disposing of the engine, you cannot reinitialize nor reuse it engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Dispose</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>
下面的代码示例说明了最常用的功能。它是从样本代码2萃取在https://github.com/jmp75/rdotnet-onboarding,这个例子说明了数值向量的基本操作。
<code class="hljs http has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="avrasm" style="box-sizing: border-box;">var e = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"x <- 3"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;// You can now access x defined in the R environment</span> NumericVector <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">x</span> = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.GetSymbol</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"x"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsNumeric</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y <- 1:10"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> NumericVector <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">y</span> = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.GetSymbol</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsNumeric</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
虽然你可以通过生成字符串并用Evaluate函数调用,并调用Evaluate方法,这可能是笨拙的,因为你传递大量数据。下面演示了如何可以调用一个函数,有点像你会如何映射在.NET中并调用一个函数。
<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Invoking functions; Previously you may have needed custom function definitions</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> myFunc = engine.Evaluate(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"function(x, y) { expand.grid(x=x, y=y) }"</span>).AsFunction(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> v1 = engine.CreateIntegerVector(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>[] { <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> }); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> v2 = engine.CreateCharacterVector(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>[] { <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c"</span> }); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> df = myFunc.Invoke(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> SymbolicExpression[] { v1, v2 }).AsDataFrame();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
R.NET1.5.10包含了许多改进,以支持直接调用函数从C#,用更少的字符串操作,少REngine.Evaluate沟通。
<code class="hljs http has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="avrasm" style="box-sizing: border-box;">// As of R<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.NET</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.10</span>, more function <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">call</span> syntaxes are supported. var expandGrid = engine<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"expand.grid"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsFunction</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> var d = new Dictionary<string, SymbolicExpression>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> d[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"x"</span>] = v1<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> d[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>] = v2<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> df = expandGrid<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Invoke</span>(d)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsDataFrame</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
我们使用expand.grid的结果继续进行,将下面的代码说明,虽然R.NET试图模仿R的行为来对应数据集。数据集为R的数据结构的核心部分,所以值得扩展,下面几个例子:
<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">engine.SetSymbol(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"cases"</span>, df); // As <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> R.NET <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.10</span>, factor <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">character</span> expressions work consistently <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> R var letterCases = engine.Evaluate(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"cases[,'y']"</span>).AsCharacter().ToArray(); // <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span>, etc. Same as as.<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">character</span>(cases[,<span class="hljs-attribute" style="box-sizing: border-box;">'y</span>']) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> R // Note that this used <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, etc. <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> R.NET <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.5</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
还有其他的方法来提取数据集的列,而不通过R表达式字符串:
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">// Equivalent: letterCases = df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsCharacter</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ToArray</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> letterCases = df[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>]<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AsCharacter</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ToArray</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
2维索引返回的行为通常直接反映了R.。唯一的例外是行名失踪,R的行为是值得商榷的,所以R.NET喜欢严格。
<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">// Accessing items by two dimensional indexing <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]; // <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span> s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]; // <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span> s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>]; // <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"b"</span> // s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"4"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>]; // fails because there are no row names df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span>; s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>]; // <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a"</span> df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"d"</span>; s = (<span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>)df[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"y"</span>]; // <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>, because we have an <NA> <span class="hljs-typename" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> R</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
要重用整个脚本,最简单的方法是使用R中的“sourece”方法
<code class="hljs mathematica has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">engine.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Evaluate</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"source('c:/src/path/to/myscript.r')"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
占位符,展示了不同各种向量类型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. |
http://rdotnet.codeplex.com/wikipage?title=Examples&referringTitle=Home
http://dynamicdatadisplay.codeplex.com/
原文转载地址:http://blog.csdn.net/guoer9973/article/details/45953471