/// *********************************************************************************************************
    ///  © 2014 www.jakemdrew.com All rights reserved. 
    ///  This source code is licensed under The GNU General Public License (GPLv3):  
    ///  http://opensource.org/licenses/gpl-3.0.html
    /// *********************************************************************************************************

    /// *********************************************************************************************************
    /// RScriptRunner - Run R Programs From C#.
    /// Created By - Jake Drew 
    /// Version -    1.0, 06/23/2014
    /// *********************************************************************************************************
	

    /// This class runs R code from a file using the console.
    /// 
    /// If this code fails, it will typically fail "silently" without 
    /// the R code running and without an error message.  This is normally 
    /// due to an incorrect argument for the rScriptExecutablePath variable.
    /// 

    public class RScriptRunner
    {

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