2013-08-05 17 views
7

Kiedy używanie RDotNet do wykonywania obliczeń statystycznych jest zaletą/wadą, a nie generowaniem pliku tekstowego skryptu R i uruchamianiem go z aplikacji za pomocą np. Process.Start? Czy jest jakiś inny lepszy sposób?Skrypty RDotNet kontra R

Muszę wykonać dużą liczbę poleceń i mieć wrażenie, że wysyłanie ich po kolei do R zabiera dużo czasu.

Odpowiedz

5

powiedziałbym następujące dwa scenariusze są stereotypowe: Kod

  1. .NET i kod R są zupełnie oddzielne, nie wiele potrzeba interakcji między kodu R i kodu .NET. Na przykład kod .NET zbiera pewne informacje i uruchamia na nim skrypt przetwarzania, po którym kod .NET odbiera wyniki. W tym przypadku utworzenie procesu R (Process.Start) jest prostym sposobem, aby to zadziałało.
  2. Konieczna jest duża interakcja między kodem .NET i kodem R. Przepływ pracy polega często na przechodzeniu między domenami .NET i R. W tym przypadku bardziej ciężkie, elastyczne rozwiązanie, takie jak RDotNet, ma wiele sensu. RDotNet umożliwia łatwiejszą integrację kodu .NET i kodu R, przy czym cena jest często trudniejsza do nauczenia, trudniej do debugowania i często musi być aktualizowana dla nowych wersji R itp.
2

Za pomocą Process.Start rozpoczniesz nową sesję R. Może to zająć trochę czasu, szczególnie jeśli używasz różnych pakietów w skrypcie, które musisz załadować.

Jeśli używasz R.NET, możesz utworzyć instancję R i kontynuować rozmowę. Jeśli więc stworzyłeś usługę sieciową do połączenia R z ASP, nie będziesz chciał uruchamiać R przez cały czas, ponieważ będzie to bardzo czasochłonne. Potrzebujesz go tylko raz i możesz pracować z nim interaktywnie.

2

Obecnie program R.NET może zostać uaktywniony jeden raz. Równoległa realizacja będzie problematyczna.

Sugerowałbym użycie RScript.

Nasze rozwiązanie oparte na tej odpowiedzi na stackoverflow Call R (programming language) from .net

ze zmianami Monor, wyślemy kod R z łańcucha i zapisać go do pliku tymczasowego, ponieważ prowadzony przez użytkownika niestandardowego kodu R, gdy są potrzebne.

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); 
      } 
     } 
    } 
} 

Pełna blogu: http://kostylizm.blogspot.ru/2014/05/run-r-code-from-c-sharp.html