RDotNet vs R scripting
本文关键字:scripting vs RDotNet | 更新日期: 2023-09-27 18:26:36
与生成R脚本文本文件并使用Process.Start从应用程序运行相比,使用RDotNet进行统计计算的优势/劣势是什么?或者还有其他更好的方法吗?
我需要执行大量的命令,并且有一种感觉,将它们一个接一个地发送到R需要花费大量时间。
我认为以下两种场景是典型的:
- .NET代码和R代码是完全分离的,R代码和.NET代码之间不需要太多交互。例如,.NET代码收集一些信息,并在此基础上启动一个处理脚本,然后.NET代码获取结果。在这种情况下,生成一个R进程(process.Start)是一种简单的方法
- .NET代码和R代码之间需要大量的交互,工作流程通常包括在.NET和R之间来回切换。在这种情况下,像RDotNet这样重量更重、更灵活的解决方案非常有意义。RDotNet允许更容易地集成.NET代码和R代码,其代价是它通常更难学习、更难调试,并且经常需要针对新版本的R等进行更新
R.NET当前可以初始化一次。并行执行会有问题。
建议使用RScript。
我们的解决方案基于这个答案,来自.net 的stackoverflow Call R(编程语言)
对于monor更改,我们从字符串中发送R代码并将其保存到临时文件中,因为用户在需要时会运行自定义R代码。
public static void RunFromCmd(string batch, params string[] args)
{
// Not required. But our R scripts use allmost all CPU resources if run multiple instances
lock (typeof(REngineRunner))
{
string file = string.Empty;
string result = string.Empty;
try
{
// Save R code to temp file
file = TempFileHelper.CreateTmpFile();
using (var streamWriter = new StreamWriter(new FileStream(file, FileMode.Open, FileAccess.Write)))
{
streamWriter.Write(batch);
}
// Get path to R
var rCore = Registry.LocalMachine.OpenSubKey(@"SOFTWARE'R-core") ??
Registry.CurrentUser.OpenSubKey(@"SOFTWARE'R-core");
var is64Bit = Environment.Is64BitProcess;
if (rCore != null)
{
var r = rCore.OpenSubKey(is64Bit ? "R64" : "R");
var installPath = (string)r.GetValue("InstallPath");
var binPath = Path.Combine(installPath, "bin");
binPath = Path.Combine(binPath, is64Bit ? "x64" : "i386");
binPath = Path.Combine(binPath, "Rscript");
string strCmdLine = @"/c """ + binPath + @""" " + file;
if (args.Any())
{
strCmdLine += " " + string.Join(" ", args);
}
var info = new ProcessStartInfo("cmd", strCmdLine);
info.RedirectStandardInput = false;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
using (var proc = new Process())
{
proc.StartInfo = info;
proc.Start();
result = proc.StandardOutput.ReadToEnd();
}
}
else
{
result += "R-Core not found in registry";
}
Console.WriteLine(result);
}
catch (Exception ex)
{
throw new Exception("R failed to compute. Output: " + result, ex);
}
finally
{
if (!string.IsNullOrWhiteSpace(file))
{
TempFileHelper.DeleteTmpFile(file, false);
}
}
}
}
完整的博客文章:http://kostylizm.blogspot.ru/2014/05/run-r-code-from-c-sharp.html
使用Process.Start,您将启动一个新的R会话。这可能需要一些时间,尤其是当您在脚本中使用需要加载的不同包时。
如果你使用R.NET,你可以创建一个R实例,并继续与它对话。因此,如果你已经创建了一个Web服务来连接R和ASP,你不想一直启动R,因为这将非常耗时。您只需要一次,就可以交互使用它。