2013-08-05 27 views
7

Khi nào nó là một lợi thế/bất lợi khi sử dụng RDotNet để tính toán thống kê trái ngược với việc tạo tệp văn bản tập lệnh R và chạy nó từ ứng dụng bằng cách sử dụng e.g. Process.Start? Hay có cách nào khác tốt hơn?RDotNet vs R scripting

Tôi cần thực hiện một số lượng lớn lệnh và có cảm giác gửi từng câu một đến R mất nhiều thời gian.

Trả lời

5

tôi muốn nói hai kịch bản của Sau đây là khuôn mẫu: Mã

  1. NET và mã R khá riêng biệt, không có nhiều sự tương tác cần thiết giữa mã R và mã NET. Ví dụ, mã .NET thu thập một số thông tin và khởi chạy một kịch bản lệnh xử lý trên đó, sau đó mã .NET sẽ nhận các kết quả. Trong trường hợp này sinh ra một tiến trình R (Process.Start) là một cách đơn giản để làm việc này.
  2. Cần có nhiều tương tác giữa mã .NET và mã R, luồng công việc bao gồm việc chuyển qua lại giữa .NET và R thường xuyên. Trong trường hợp này, một trọng lượng nặng hơn, giải pháp linh hoạt như RDotNet làm cho rất nhiều ý nghĩa. RDotNet cho phép tích hợp dễ dàng hơn mã .NET và mã R, với mức giá thường khó học hơn, khó gỡ lỗi hơn và thường cần được cập nhật cho các phiên bản R mới, v.v.
2

Với Process.Start bạn sẽ bắt đầu một phiên R mới. Quá trình này có thể mất chút thời gian, đặc biệt nếu bạn đang sử dụng các gói khác nhau trong tập lệnh mà bạn cần tải.

Nếu bạn sử dụng R.NET, bạn có thể tạo một cá thể R và tiếp tục nói chuyện với nó. Vì vậy, nếu bạn đã tạo một webservice để kết nối R với ASP bạn không muốn khởi động R tất cả các thời gian vì điều này sẽ rất tốn thời gian. Bạn cần nó chỉ một lần và bạn có thể làm việc với nó một cách tương tác.

2

R.NET hiện có thể bắt đầu một lần. Việc thực thi song song sẽ có vấn đề.

Đề nghị sử dụng RScript.

giải pháp của chúng tôi dựa trên câu trả lời này trên stackoverflow Call R (programming language) from .net

Với sự thay đổi Monor, chúng tôi gửi mã R từ chuỗi và lưu nó vào tập tin tạm thời, vì mã R sử dụng chạy tùy chỉnh khi cần thiết.

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

bài Full blog: http://kostylizm.blogspot.ru/2014/05/run-r-code-from-c-sharp.html