2015-10-19 2 views
2

У меня есть простой скрипт R, который принимает входное значение и выполняет некоторые вычисления на основе входного значения и записывает его в файл csv. Ниже приведен код моего r-скрипта.Использование RScript.exe для запуска rscript с параметром

testfun=function(x){ 
    x<-args[1] 
    x=sqrt(x)+(x*x) 
    a=x+x+x 
    b=data.frame(x,a) 
    setwd("D:\\R Script") 
    write.csv(b,"testfun.csv",row.names=F) 
} 

Я называю это rscript из моего asp.net веб-приложения, используя Rscriptrunner предоставленный Jake Дрю

/// <summary> 
/// This class runs R code from a file using the console. 
/// </summary> 
public class RScriptRunner 
{ 
    /// <summary> 
    /// 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]); 
    /// </summary> 
    /// <param name="rCodeFilePath">File where your R code is located.</param> 
    /// <param name="rScriptExecutablePath">Usually only requires "rscript.exe"</param> 
    /// <param name="args">Multiple R args can be seperated by spaces.</param> 
    /// <returns>Returns a string with the R responses.</returns> 
    public static string RunFromCmd(string rCodeFilePath, string rScriptExecutablePath, string args, int iInput) 
    { 
      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(); 
        proc.Close(); 
       } 

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

таким образом, что я призываю мой сценарий rscriptrunner как ниже

int x = 64; 

    string scriptPath = string.Format(@"C:\Program Files\R\{0}\bin\Rscript.exe", Rversion); 
    string path = string.Format(@"D:\testfun.r"); 
    string result = RScriptRunner.RunFromCmd(path, scriptPath, path.Replace('\\', '/'), x); 

В основном я хочу предоставить значение x из моего веб-приложения в свой код r и получить вывод в файле csv, указанном в r-скрипте.

Я попробовал несколько способов, предусмотренных в нижеприведенных нитей

Passing Command

How can I read command line parameters from an R script?

Run R script with start.process in .net

Однако я не могу получить то, что я хочу. Сценарий не выполняется. Я также попытался добавить args < -commandArgs (TRUE) в свой rscript, но его не работает.

В основном я разработчик .net и хочу запустить r-скрипт из своего веб-приложения из-за некоторой потребности клиента. Я не настолько осведомлен о R, и если кто-то помогает мне в том, как мне передать значение параметра моему r-коду, это было бы полезно для меня.

+0

Это весь ваш код R? Вы определяете функцию, но никогда не используете ее. –

+0

Да. Функция вызывается как testfun (значение x) после выполнения вышеуказанного кода. –

ответ

1

Я нашел способ предоставить параметр моей функции через ASP.NET C#.

В основном я создал обертку для моего кода r, так что я вызываю свой настоящий r-код из другого кода wrapper.r, в котором передаю свои аргументы.

код обертки будет, как показано ниже

args <- commandArgs(TRUE) 
r <- as.double(args[1]) 
x <- as.double(args[2]) 
source("logistic.R") 
logistic(r, x) 

Здесь я звоню мой реальный код г, используя функцию источника и передавая аргументы моей logistic.R кода.

После того, как я создал обертку, я уверен, выполнение моего г кода, используя следующий код

Rscript logistic-wrapper.R 3.2 0.5 

выполняющегося логистический-wrapper.R вместе с аргументами 3.2 и 0.5 будет выполнять мой logistic.r код, который предоставляется аргументы.

+0

Я строил то же самое сейчас, но я нашел ваш код немного запутанным. например, вы дважды проходите путь для rscript, и он становится аргументом. и где именно вы вызываете Rscript logistic-wrapper.R 3.2 0.5? пожалуйста, помогите мне –

0

быстрый способ сделать так, чтобы запустить R CMD партии с арг и писать Youre результатов в файл, позволяет сказать .json из командной строки: R CMD BATCH --slave «--args а»

в R:

args <- commandArgs(trailingOnly = TRUE) 
a <- args[1] 
b <- args[2] 
c <- args[3] 

и просто написать свои результаты в файл

0

Вы можете использовать пакет funr.

Предположим, что ваш сценарий выглядит следующим образом

# define the function 
testfun <- function(x = 2, outfile = "testfun.csv"){ 
    x=sqrt(x)+(x*x) 
    a=x+x+x 
    b=data.frame(x, a) 
    #setwd("D:\\R Script") 
    write.csv(b,outfile,row.names=F) 
} 

help_text = " 
This script creates a data.frame and writes it out as a CSV file. 

Usage: testfunr.R testfun x=<a number> outfile=<myfile.csv> 
" 

library(funr) 
out = funr(commandArgs(trailingOnly = TRUE), help_text = help_text) 

Тогда простой вызов вашей функции с параметрами.

Rscript testfun.r testfun x=2 
# one may explicitly provide the output filename as well 
Rscript testfun.r testfun x=2 outfile=myfile.csv 
+0

Привет Пробовал решение, но не получал файл testfun.csv. Я попытался запустить код в r studio, но он дает мне ошибку в x <-args [1]. я удалил эту часть, и она работала через студию r, но не в веб-приложении. –

+0

Вы можете попробовать это, я скопировал вашу функцию как есть, не понял, что у нее были некоторые проблемы. –

Смежные вопросы