R脚本形式C#。传递参数,运行脚本,检索结果

时间:2012-12-24 11:52:47

标签: c# r

我想知道在传递值列表时是否可以运行Rscript,运行R脚本然后将值的重新分配列表输出回c#。

我见过有人说R.NET很好,但我只看到使用它直接创建值,操作它们,访问它们等等的例子,当我想要做的就是运行已经创建的脚本在数据中,处理它并返回数据。我也知道我可以用csv文件做到这一点,但重点是我想切断中间人。

1 个答案:

答案 0 :(得分:4)

这个问题大约有5年的历史,并且有一些答案可供选择here。我将使用一个非常简单的R脚本来完成它。

最好从这个link

开始

在这个简单的例子中,我将3传递给R,用5添加它并得到结果(8)。

<强>步骤

  1. 使用您的r代码创建一个name.r的文本文件,如下所示。我把它命名为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)
    
  2. 然后创建一个c#类(称之为任何内容,我称之为RScriptRunner),如下所示,也可以在here处获得。这是一个简单的类,它只调用一个过程(一个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);
                }
            }
        }
    

    然后调用并传递

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

    rscript.exe位于您的R目录中,path是您的r脚本的位置(rcodeTest.r

    现在您可以将结果8 = 5 + 3作为输出,如下所示。 enter image description here