R语言是个解释执行的语言,语法风格对于常年写C#的我来说非常怪异。并且R的web包shiny用起来也不是很顺手,所以如果要把R的功能用作生产,我倾向于用高级语言给他做一次封装,这样无论是可扩展性还是性能调优空间都会比较有把握。
用.NET调用R语言的方法有两种,一是采用R.net库,官方地址:R.NET,另外一种是利用控制台执行.R代码。我采用的是第二种方法,为什么倾向于第二种后面会说,先简单介绍一下两种不同的方法。
R.NET
R.net可以在C#代码里开启一个R引擎,然后往R引擎中塞入代码段或者直接执行.R文件,并获取执行结果,他的代码大概长这样子
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();
}
但显然这种方法有三个弊端:
- 不适合R代码已经开发好的情况
- 会花费一些没有太大意义的学习成本去熟悉这个库的规则
- 无法保证这个R.NET的版本能跟上R的版本更新
.NET启动控制台调用R代码
所以我个人倾向于用控制台去调用.R的代码,通过文件IO进行输入输出。流程图如下