c#调用R语言(原创翻译)

原创 2015年05月24日 17:29:28

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 environment
NumericVector 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 definitions
var 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 R
var 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 indexing
string 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 names
df[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语言

添加 using RDotNet; RDotNet.REngine.SetEnvironmentVariables();//设置R语言运行环境//REngine.SetEnvi...
  • shang8shen
  • shang8shen
  • 2015年11月03日 16:55
  • 1457

C#调用R语言之.NET

Step1:安装R语言软件 Step2:http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc997...
  • cyb6100300115
  • cyb6100300115
  • 2013年10月17日 13:08
  • 10055

一种C#调用R的方法

  • 2014年11月22日 19:59
  • 16KB
  • 下载

vs2015 C# 和R语言并行开发

1. vs2015 nuget; 2. 搜索R.NET 把以下包下载到项目中:       3. 安装r语言包, 下载地址: https://mirrors.ustc...
  • WDYDXF
  • WDYDXF
  • 2017年07月21日 16:05
  • 462

c#调用R语言

介绍 本页面涉及R.NET1.5.13。 1.5.13版本在功能上等同于1.5.12,但可作为一个包在NuGet.org上获得。 R.NET使.NET框架与R统计语言在同一进程进行互操作。 R.N...
  • SunCherryDream
  • SunCherryDream
  • 2016年03月12日 21:45
  • 1985

R语言里调用C++

使用Rcpp可以很方便地在.r脚本里调用C++函数。软件环境:R2.15.3+RStudio 0.99+RTools30.exe + Rcpp   1.在R2.15.3上安装Rcpp   打开R ...
  • sanqima
  • sanqima
  • 2015年12月11日 21:27
  • 2492

语言文件.po .pot和.mo简介及汉化

一、文件简介  .po文件,.mo文件,.pot文件是由gettext程序生成或者使用的源代码和编译结果。 1、.pot文件  是一种模板文件,其实质与.po文件一样,其中包含了从源代码...
  • opencn8
  • opencn8
  • 2014年04月14日 22:04
  • 2108

python汉译英-调用Google翻译

一:使用正则表达式提取翻译结果 # -*- coding: utf-8 -*- __author__ = "zlingh" __date__ = "Date: 2014/01/28" imp...
  • zhangpinghao
  • zhangpinghao
  • 2014年01月28日 14:18
  • 2489

Android string.xml多语言翻译工具

Android string.xml 翻译工具源码你可以在Github上看到:https://github.com/onlynight/Translator概述最近要把公司的app往国外推广,无奈只做...
  • tgbus18990140382
  • tgbus18990140382
  • 2016年10月31日 19:07
  • 2721

R.net简介(原创翻译)

当你看到这篇文章的时候,你应该亲我一下。因为它花费了我一个可以泡妞的下午来翻译。R.net地址:http://rdotnet.codeplex.com/R.NETR.NET使.NET框架在同一进程与R...
  • guoer9973
  • guoer9973
  • 2015年05月24日 16:09
  • 1008
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#调用R语言(原创翻译)
举报原因:
原因补充:

(最多只允许输入30个字)