1. 程式人生 > >R語言學習筆記——C#中如何使用R語言setwd()函式

R語言學習筆記——C#中如何使用R語言setwd()函式

在R語言編譯器中,設定當前工作資料夾可以用setwd()函式。

> setwd("e://桌面//")
> setwd("e:\桌面\")
> setwd("e:/桌面/")

這三種結構都是可以編譯通過的,

但是在VS C#中卻不行,只有一種能執行成功。

(PS:R語言在VS中執行要先配置環境,還沒配置的童鞋先要配置好,才可執行,如有問題可看我前面的隨筆。)

就是這種結構,engine.Evaluate("setwd('e:/桌面/')");

我除錯了很多次,確實只有這樣寫才能設定它的工作資料夾,但是必須保證資料夾存在。

下面貼上完整程式碼,我是在winform中除錯的,然後用PictuerBox顯示圖片。

//配置R語言環境
        private void LoadRPath(string RVersion = "R-3.4.1")//預設R-3.4.1
        {

            string dlldir = @"C:\Program Files\R\" + RVersion + @"\bin\x64";//預設64位

            bool r_located = false;

            var rPath = System.Environment.Is64BitProcess ?

                string.Format(@"C:\Program Files\R\" + RVersion + @"\bin\x64") :

                string.Format(@"C:\Program Files\R\" + RVersion + @"\bin\i386");

            dlldir = rPath;

            while (r_located == false)
            {

                try
                {

                    REngine.SetEnvironmentVariables(dlldir);

                    r_located = true;

                }

                catch
                {

                    if (System.Environment.Is64BitProcess)
                    {

                        MessageBox.Show(@"找不到R執行環境:\R\" + RVersion + @"\bin\x64 " + " \n請手動新增資料夾目錄");

                    }

                    else
                    {

                        MessageBox.Show(@"找不到R執行環境:\R\" + RVersion + @"\bin\i386" + " \n請手動新增資料夾目錄");

                    }

                    FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();

                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                    {

                        dlldir = @folderBrowserDialog1.SelectedPath;

                    }

                }

            }

        }

        private void CalculateHist()
        {
            //避免產生相同名稱檔案
            string rnd = System.Guid.NewGuid().ToString().Replace("-", "");
            string fileName = "i" + rnd + "_Hist.png";
            //拿到程式執行目錄
            string sysPath = Application.StartupPath;
            string dir = sysPath + "\\RImage\\Hist\\";
            string fullDir = dir + fileName;
            //建立資料夾
            Directory.CreateDirectory(Path.GetDirectoryName(dir));
            //替換
            dir = dir.Replace("\\", "/");
            //設定工作資料夾
            engine.Evaluate("setwd('" + dir + "')");
            engine.Evaluate(string.Format("png(file='{0}',bg ='transparent',width={1},height={2})", fileName, this.ptbHist.Width, this.ptbHist.Height));

            //            string Rcode = @"library('scatterplot3d')
            //       z <- seq(-10, 10, 0.01) 
            //       x <- cos(z)
            //       y <- sin(z) 
            //       scatterplot3d(x, y, z, highlight.3d=TRUE, col.axis='blue', col.grid='lightblue',main='3d繪圖',pch=20)
            //       ";
            engine.Evaluate(@"x <- (0:12) * pi / 12
                y <- cos(x)
                plot(x,y);
                ");
            //engine.Evaluate(Rcode);
            engine.Evaluate("dev.off()");

            //var x = engine.Evaluate("x <- rnorm(100, mean=50, sd=10)").AsNumeric();

            //engine.Evaluate("hist(x)");
            //var x = engine.Evaluate("x <- 1:100").AsNumeric();

            //var y = engine.Evaluate("y <- 5:105").AsNumeric();

            //engine.Evaluate("model = function (a,    b){23.86+5.525*b-2.5725*a-6.6413*b^2-5.1862*a^2}"); //evaluate function

            //engine.Evaluate("z = outer(x, y ,model)");

            //engine.Evaluate("contour(x,y,z, nlevels = 10)");
            //string path = System.IO.Path.GetFullPath(fileName);
            Bitmap image = new Bitmap(fullDir);
            ptbHist.Image = image;
        }

  歡迎大家交流學習~~~~~~~~

&n