2012-12-24 26 views
5

Tôi muốn biết nếu nó có thể chạy một Rscript trong khi đi qua trong một danh sách các giá trị, có R script chạy và sau đó xuất ra một danh sách resluting của các giá trị trở lại C#.Mẫu mã R C#. Thông qua các đối số, chạy script, lấy các kết quả

Tôi đã thấy mọi người nói rằng R.NET là tốt nhưng tôi chỉ nhìn thấy các ví dụ về cách sử dụng nó để tạo các giá trị trực tiếp, thao tác chúng, truy cập chúng, vv khi những gì tôi muốn làm là chạy tập lệnh đã tạo lấy dữ liệu, xử lý dữ liệu và trả về dữ liệu. Tôi cũng biết rằng tôi có thể làm điều này với các tập tin csv nhưng vấn đề là tôi muốn cắt bỏ người đàn ông trung gian.

Trả lời

1

Câu hỏi này là khoảng 5 tuổi và có một số câu trả lời có sẵn cho điều này như here. Tôi sẽ đi qua nó với một kịch bản rất đơn giản R.

Nó là tốt để bắt đầu với điều này link

Trong ví dụ đơn giản này, tôi vượt qua 3 đến R, thêm nó với 5 và nhận được kết quả (8) trở lại.

bước

  1. Tạo một file văn bản như name.r, với mã r bạn, một cái gì đó như dưới đây. Tôi đặt tên nó như rcodeTest.r

    library(RODBC) # you can write the results to a database by using this library 
    args = commandArgs(trailingOnly = TRUE) # allows R to get parameters 
    cat(as.numeric(args[1])+5)# converts 3 to a number (numeric) 
    

Sau đó, tạo ra một lớp C# (gọi nó là bất cứ điều gì, tôi gọi nó là RScriptRunner) như dưới đây, cũng có sẵn tại here. Đây là một lớp đơn giản mà chỉ gọi một thủ tục (một tập tin exe)

using System; 
    using System.Collections.Generic; 
    using System.Diagnostics; 
    using System.IO; 
    using System.Linq; 
    using System.Web; 

    /// <summary> 
    /// Summary description for RScriptRunner 
    /// </summary> 
    public class RScriptRunner 
    { 
     public RScriptRunner() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 
     // Runs an R script from a file using Rscript.exe. 
     /// 
     /// Example: 
     /// 
     /// RScriptRunner.RunFromCmd(curDirectory +   @"\ImageClustering.r", "rscript.exe", curDirectory.Replace('\\','/')); 
     /// 
     /// Getting args passed from C# using R: 
     /// 
     /// args = commandArgs(trailingOnly = TRUE) 
     /// print(args[1]); 
     /// 
     /// 
     /// rCodeFilePath   - File where your R code is located. 
     /// rScriptExecutablePath - Usually only requires "rscript.exe" 
     /// args     - Multiple R args can be seperated by spaces. 
     /// Returns    - a string with the R responses. 
     public static string RunFromCmd(string rCodeFilePath, string   rScriptExecutablePath, string args) 
     { 
      string file = rCodeFilePath; 
      string result = string.Empty; 

      try 
      { 

       var info = new ProcessStartInfo(); 
       info.FileName = rScriptExecutablePath; 
       info.WorkingDirectory =   Path.GetDirectoryName(rScriptExecutablePath); 
       info.Arguments = rCodeFilePath + " " + args; 

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

       } 

       return result; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("R Script failed: " + result, ex); 
      } 
     } 
    } 

Sau đó gọi và vượt qua các thông số như

 result = RScriptRunner.RunFromCmd(path + @"\rcodeTest.r", @"D:\Programms\R-3.3.3\bin\rscript.exe", "3"); 

rscript.exe nằm trong thư mục R của bạn, và path là vị trí của bạn r script (rcodeTest.r)

Bây giờ bạn có thể có kết quả 8 = 5 + 3 làm đầu ra như hình dưới đây. enter image description here

+0

Trả về dữ liệu Rscript của tôi với tiêu đề và 3 hàng. làm thế nào để đọc nó? –

+0

Bạn có bất kỳ hạn chế nào khi sử dụng cơ sở dữ liệu không? Nếu không, hãy tạo một bảng và lưu trữ các giá trị trong bảng này (R), và chuyển tên bảng cho kịch bản của bạn (C#). hoặc chỉ sử dụng bảng và lược đồ được xác định trước. Bạn có thể cần phải sử dụng gói RODBC trong R cho việc này. –

+0

Hiện tại tôi có quyền đọc, nhưng tôi phải yêu cầu quyền ghi. nhưng có cách nào để đọc đầu ra như là? mà không lưu nó trong DB? hoặc chuẩn bị toàn bộ bảng dưới dạng chuỗi và gửi dưới dạng chuỗi? Tôi bị lạc. Tôi cũng tạo ra một API còn lại với thợ sửa ống nước, nó trả lại cho tôi kết quả JSON dự kiến, nhưng nó là một luồng duy nhất, vì vậy chỉ có một tiến trình được phép tại một thời điểm. –

Các vấn đề liên quan