我有一个简单的R脚本,它接受输入值并根据输入值进行一些计算,并将其写入csv文件。下面是我的r脚本的代码。
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)
}
我使用Jake Drew提供的Rscriptrunner从我的asp.net Web应用程序调用此脚本
/// <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);
基本上我想将我的Web应用程序的x值提供给我的r代码,并在r脚本中指定的csv文件中获取输出。
我尝试了以下线程中提供的几种方法
How can I read command line parameters from an R script?
Run R script with start.process in .net
然而,我无法得到我想要的东西。脚本没有被执行。 我也尝试在我的脚本中添加args&lt; -commandArgs(TRUE),但它不起作用。
基本上我是.net开发人员,并且由于某些客户需要,我想从我的Web应用程序运行r脚本。我对R的了解并不多,如果有人帮助我如何将参数值传递给我的r代码,那对我来说会有所帮助。
答案 0 :(得分:1)
我找到了一种通过ASP.NET C#为我的函数提供参数的方法。
基本上我为我的r代码创建了一个包装器,这样我就可以从另一个wrapper.r代码中调用我真正的r代码,其中我传递了我的参数。
包装器代码如下所示
args <- commandArgs(TRUE)
r <- as.double(args[1])
x <- as.double(args[2])
source("logistic.R")
logistic(r, x)
在这里,我使用source函数调用我的真实代码并将参数传递给我的logistic.R代码。
一旦我创建了包装器,我就使用以下代码执行我的r代码
Rscript logistic-wrapper.R 3.2 0.5
执行logistic-wrapper.R以及参数3.2和0.5将执行随参数提供的logistic.r代码。
答案 1 :(得分:0)
最快的方法是使用args运行R CMD批处理并将结果写入文件,让我们说.json 从命令行: R CMD BATCH --slave' - args a b c'
R中的
args <- commandArgs(trailingOnly = TRUE)
a <- args[1]
b <- args[2]
c <- args[3]
并将结果写入文件
答案 2 :(得分:0)
你可以使用包乐器。
假设您的脚本看起来像这样
# 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