C#通过调⽤系统命令执⾏R脚本
在C#中调⽤命令执⾏R脚本,要实现这个功能我们得知道:(1)如何⽤c#调⽤系统命令;(2)如何⽤系统命令执⾏R脚本;(3)如何写R脚本⼀、C#调⽤系统命令
这⾥的“startInfo.FileName = "";”是通过C#调⽤的系统命令,当然你也可以执⾏,也可以执⾏其他的应⽤和程序,⽐如计算
器“calc”,R程序“R.exe”等。这⾥的“string[] command”参数是要执⾏的命令语句,我这⾥是针对的是控制台,因为其他的应⽤程序我不知道怎么将参数传⼊程序中。
1///<summary>
2///执⾏DOS命令,返回DOS命令的输出
3///</summary>
4///<param name="dosCommand">dos命令</param>
5///<param name="milliseconds">等待命令执⾏的时间(单位:毫秒),
6///如果设定为0,则⽆限等待</param>
7///<returns>返回DOS命令的输出</returns>
8public string Execute(string[] command, int seconds = 10)
9 {
10string output = ""; //输出字符串
11if (command[0] != null && !command[0].Equals(""))
12 {
13 Process process = new Process();//创建进程对象
14 ProcessStartInfo startInfo = new ProcessStartInfo();
15 startInfo.FileName = "";//设定需要执⾏的命令
16//startInfo.Arguments = "/C " + command;//“/C”表⽰执⾏完命令后马上退出
17//startInfo.Arguments = command;//“/C”表⽰执⾏完命令后马上退出
18 startInfo.UseShellExecute = false;//不使⽤系统外壳程序启动
19 startInfo.RedirectStandardInput = true; //重定向输⼊
20 startInfo.RedirectStandardOutput = true; //重定向输出
21 startInfo.CreateNoWindow = true;//不创建窗⼝
22 process.StartInfo = startInfo;
23try
24 {
25if (process.Start())//开始进程
26 {
27if (seconds == 0)
28 {
29 process.WaitForExit();//这⾥⽆限等待进程结束
30 }
31else
32 {
33 process.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒
34 }
35 StreamWriter sw = process.StandardInput;
36 sw.WriteLine(command[0]);
37 sw.WriteLine(command[1]);
38 sw.Close();
39//process.StandardInput.Close();
40 output = process.StandardOutput.ReadToEnd();//读取进程的输出
41 }
42 }
43catch
44 {
45 }
46finally
47 {
48if (process != null)
49 process.Close();
50 }
51 }
52return output;
53 }
c#调⽤系统命令
⼆、⽤系统命令执⾏R脚本
先说明⼀下⽤控制台执⾏R脚本,⽽之后的⽤C#调⽤系统命令执⾏R脚本就是将这些控制台的语句当作参数传⼊上⾯的string[] command数组中
1、将R.exe所在路径加到环境变量path下,路径⼀般为C:\Program Files\R\R-3.0.1\bin或者在控制台中敲⼊要转⼊的⽬录。
2、在windows 命令⾏中敲⼊调⽤命令:r CMD BATCH D:\RWORKSPACE\CMD_TEST.R (注意 CMD BATCH 都要⼤写)
命令的普遍形式为R CMD command file,command是别的⼯具。⽐如前⾯⽤到的批处理⼯具BATCH。
这样它就在执⾏R脚本了。我的测试脚本很简单,当然你可以写的很复杂,执⾏你要完成的任务。
结果它会⽣成⼀个rasterName.csv的结果⽂件和执⾏状态的⽂件Rout⽂件
三、写R脚本
当然你可以很简单的在记事本中写R脚本,但是为了应⽤程序的可交互性,你可以⽤代码在记事本中写脚本,但是要注意的是⽂件路径的问题。因为在R程序中的路径是“\\”或者“/”的,你的代码中可以将获取的路径的符号其替换为“\\\\”或者“/”。不然⽆法读取⽂件。
1///<summary>
2///创建随机森林影像分类R脚本
3///</summary>
4///<param name="rowCount"></param>
5///<param name="columnCount"></param>
6///<param name="bandCount"></param>
7///<param name="workPath"></param>
dos命令运行exe程序8///<param name="roiPath"></param>
9///<param name="rasterPath"></param>
10public void CreateRandomForestScript(int rowCount=2850, int columnCount=2850, int bandCount=4, string workPath = @"D:", string roiPath = "", string rasterPath = "")
11 {
12string scriptPath = System.IO.Path.GetFullPath(workPath) + @"\randomForest.r";
13 workPath = workPath.Replace("\\", "\\\\"); //workPath = workPath.Replace('\\', '/');
14 roiPath = roiPath.Replace("\\", "\\\\");
15 rasterPath = rasterPath.Replace("\\", "\\\\");
16string resultName = "";
17string str = "";
18string funStr = "";
19using (StreamWriter sr = new StreamWriter(scriptPath,false,Encoding.GetEncoding("GB2312")))
20 {
21 str = "setwd('"+workPath+"')\n";
22 str += "library(randomForest)\n";
23 str += "roi<-read.table('" + roiPath + "')\n";
24//str += "roi<-read.table(file.choose())\n";
25 str += "raster<-read.table('" + rasterPath + "')\n";
26//str += "raster<-read.table(file.choose())\n";
27 funStr = "V" + (bandCount + 1) + "~";
28for (int i = 0; i < bandCount;i++)
29 {
30 funStr += "V" + (i + 1)+"+";
31 }
32 funStr = funStr.Remove(funStr.Length-1);
33 str += "spam<-randomForest("+funStr+",data=roi)\n";
34//str += "spam<-randomForest(V5~V1+V2+V3+V4,data=roi)\n";
35 str += "rm(roi)\n";
36 str += "gc()\n";
37 str += "c<-predict(spam,raster,type='response')\n";
38 str += "rm(spam)\n";
39 str += "rm(raster)\n";
40 str += "gc()\n";
41 str += "e<-unlist(c)\n";
42 str += "result<-matrix(e,nrow="+rowCount+",ncol="+columnCount+")\n";
43 str += "rm(c)\n";
44 str += "rm(e)\n";
45 str += "gc()\n";
46 str += "write.table(result, '" + resultName + "')\n";
47 str += "rm(result)\n";
48 str += "gc()\n";
49 sr.WriteLine(str);
50 sr.Close();
51 }
52 }
代码创建脚本
这是写的创建随机森林影像分类的脚本的函数,产⽣的脚本⽂件如下:
四、调⽤系统命令执⾏R脚本
主要的是command 参数那两⾏代码
1private void buttonOK_Click(object sender, EventArgs e)
2 {
3try
4 {
5if (workPath == "" || roiPath == "" || rasterPath == "" || textBoxX1.Text == "" || textBoxX2.Text == "")
6return;
7 rowCount = Convert.ToInt32(textBoxX1.Text);
8 columnCount = Convert.ToInt32(textBoxX2.Text);
9 bandCount = Convert.ToInt32(integerInput1.Value);
10 RandomForestClassfier randomForest = new RandomForestClassfier();
11 randomForest.CreateRandomForestScript(rowCount, columnCount, bandCount, workPath, roiPath, rasterPath); 12string[] command = new string[2];
13 command[0] = "cd /d C:\\Program Files\\R\\R-3.2.1\\bin\\x64";
14 command[1] = "r CMD BATCH "+workPath+@"\randomForest.r";
15 randomForest.RunRandomForestScript(command);
16 MessageBox.Show("影像分类完成", "提⽰", MessageBoxButtons.OK, MessageBoxIcon.Information);
17 }
18catch (Exception ex)
19 {
20 MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
21 }
22 }
调⽤系统命令执⾏脚本
五、参考资料
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论