:::

直接執行R腳本:RScript Caller / Running a R Script Directly in Windows: RScript Caller

image

以往要使用R腳本(RScript)的時候,我都是將R腳本用RStudio開啟,再用RStudio執行。但這樣子執行挺麻煩的,也不太直覺。所以我用AutoIT開發了一個直接用指令端呼叫R腳本的exe程式:RScript Caller,方便供Windows使用。這樣我們在檔案總管中直接雙擊R腳本就可以執行R腳本的內容。以下我就來介紹一下怎麼取得RScript Caller、設定與使用吧。


下載 / Download

2018-02-10_222042

2018-02-10_222153

下載後直接解壓縮即可。

image

在這裡面我們主要會用到的是以下兩個檔案:

  • RScript-Caller.exe 主程式,要讓R腳本關聯到主程式
  • config.ini 設定檔,設定R環境的路徑

設定 / Configuration

若要順利使用RScript Caller,我們需要在config.ini中設定好R環境的路徑,然後將R腳本關聯到RScript Caller.exe主程式。

設定檔 / config.ini

image

請先用文字編輯器開啟config.ini。我推薦使用Notepad++來編輯。

image

在這個檔案中,我們唯一要編輯的參數就是rscript_path,請設定好你安裝R環境時正確的環境。一般預設是安裝在「C:\Program Files\R\R-3.4.0\bin\x64\Rscript.exe」,但是紅字的「3.4.0」會隨著你安裝的R環境版本而有所不同。另外藍字的「x64」是64位元的版本,若是32位元的電腦,請使用「i386」。請確認該路徑真的有Rscript.exe檔案,否則RScript Caller無法順利執行喔。

關聯程式 / Associate RScript file with RScript Caller

image

我們用同資料夾底下的example.r來設定R腳本的關聯程式。請在該檔案上按右鍵,進入「開啟檔案」中的「選擇預設程式」。

image

按下右下角的「瀏覽」。

image

選擇「RScript-Caller.exe」,開啟。

image

確認RScript-Caller.exe已經正確選擇了,就可以按下「確定」。

image

接下來就可以看到example.r的執行結果了,如上圖所示,原來example.r是個「Hello, World!」呢!


使用 / Usage

2018-02-10_225004

如果有正確設置的話,那以後只要雙擊副檔名為「r」的R腳本,就會自動呼叫RScript Caller來執行。

讓我們以多組常態分佈資料之差異檢定與事後比較:R的ANOVA與Welch's anova中的R腳本為例子中的Parametric Tests for Comparing Many Non-normal Distribution Groups.R,來看看它執行的過程吧。該腳本還需要搭配ANOVA example - data.csv才能使用,所以也請一併下載吧。

anime

整個執行過程我用ScreenToGIF錄了下來,可以看到執行的過程相當簡單,分析結果就跑出來了。以後用這個來操作R腳本就快多了呢!不過如果你是第一次執行的話,R環境需要安裝大量套件,所以需要先耐心等待喔。


結語 / In closing

有人可能會問:「為什麼不要直接關聯Rscript.exe就好了?」

在RScript Caller中,我還做了些額外的動作:

  • 調整工作目錄為R腳本的所在目錄
  • 在執行完R腳本後,用「pause」暫停,以方便檢視執行結果

最主要的是那個「pause」,不然執行結果會直接關閉,讓人看不到到底執行了什麼。

其實在寫RScript Caller之前,我已經有寫過呼叫Node.js的Node.js Caller。但那時候寫Node.js跟用AutoIT寫Caller的技術都不是很好,以前遇到的一些問題,這次都在RScript Caller中做了改進。

要讓RScript Caller順利運作,除了AutoIT本身要寫得好之外,最重要的是R腳本本身是完整沒有問題的。我原本都在RStudio裡面寫R腳本,沒想到RStudio幫我做了相當多的事情,導致在RScript執行的時候頻頻遭遇錯誤。一些錯誤的解法我放在這裡的留言,都是很細微的錯誤,而且相當難Google詢問,這花了我很多的時間處理。

話說回來,要讓R腳本好用,我想最重要的還是能夠使用檔案選擇GUI介面,讓使用者選擇檔案的file.choose()方法功不可沒。大家寫R腳本的時候,基本上都會把檔案路徑寫死,導致使用者在用它的時候,還要先想想R腳本用到的檔案路徑是什麼,比較麻煩。用了file.choose()之後,就可以讓使用者自行選擇,用起來更為順手。

下一個我想做的是Python Caller,Python裡面相當多好用的函式庫,偶爾我還是會用Python在分析資料。Python似乎也有互動式的檔案選擇GUI介面:tkFileDialog,下次我在改寫Python腳本的時候就來用用看吧。


這篇用RScript Caller執行R腳本的說明就到這邊囉。你平常是怎麼執行R腳本的呢?用指令列?還是用RStudio?如果你有什麼建議的話,歡迎在下面留言提出指教。如果你覺得RScript Caller還不錯用的話,請幫我在AddThis分享工具按讚、將這篇分享到Facebook等社群媒體吧!感謝你的耐心閱讀,讓我們下一篇見。

總共6 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 我更新了程式,讓執行結果看起來更簡潔一點
    https://lh3.googleusercontent.com/-YSobj7TG4ik/Wn_xe6QEPzI/AAAAAAADprY/rdMncnu18hMndTI9HiJr3O9Xa5ALjEYyQCHMYCw/s0/2018-02-11_153102.jpg

    如果將R腳本關聯到RScript Caller時有問題,請改用Default Program Editor,教學如下:
    http://blog.pulipuli.info/2011/04/default-program-editorwindows7xmind.html

    此外,昨晚也順手把Python Caller完成了XD
    https://github.com/pulipulichen/Python-Caller

    回覆刪除
  2. 你好,我本身使用Windows Subsystem,可以透過command line或powershell執行Rscript的命令方式是"wsl Rscript",例如wsl Rscript -e 1+1會順利輸出2,但我如果設定rscript_path="C:\Windows\System32\wsl.exe Rscript",會出現錯誤"RScriprt doesn't exists in path C:\Windows\System32\wsl.exe Rscript",我想請問有沒有辦法讓這個caller能夠同樣運作順利的方式?

    回覆刪除
    回覆
    1. To Worldhero,

      我這邊還沒有可以執行Windows中Linux的wsl,我也不太瞭解Windows跟Linux子系統之間的互動

      就我的想象來說,你要在Linux中執行RScript,你需要在Linux中安裝對應的R環境。
      一般來說,我們會用sudo apt-get install r-base之類的方式來安裝,詳情請看許多介紹如何在Ubuntu安裝R的教學:
      https://www.digitalocean.com/community/tutorials/how-to-install-r-on-ubuntu-16-04-2

      如果Linux環境有安裝R,那麼就能夠直接呼叫Rscript指令。這篇有給個例子:
      http://xgenecode.com/wp/2017/11/15/install-run-r-script-linux-ubuntu/?i=1

      我不確定Windows中的Linux子系統能不能抓到Windows環境裡面的東西,但我通常都是直接就Linux思維去設定,感覺比較單純。
      供您參考。

      刪除
  3. 最近有網友問說為什麼最後會有pause指令

    那個pause會保留現在的視窗
    沒有pause的話,執行結果會直接關閉,不方便查看結果

    如果想要關閉這個功能的話,需要修改RScript-Caller.au3的程式碼並用AutoIT3重新編譯了
    https://github.com/pulipulichen/RScript-Caller

    回覆刪除
  4. 感謝有這麼好用的程式
    我目前用Rscript-Caller自動定時執行R code
    但又希望是interactive R session
    因為我需要用svDialogs package在中間跳出對話框讓我輸入參數
    但似乎從terminal執行的R code都預設是non-interactive
    查了很多地方都不知道如何解決 直接用Rscript.exe 或Rterm.exe執行也搞不定
    請問有甚麼解決方案嗎
    感激不盡!

    回覆刪除
    回覆
    1. 你好,

      我Google了一下,發現有terminalExecute()這種方法
      https://cran.r-project.org/web/packages/rstudioapi/vignettes/terminal.html

      似乎可以研究看看?

      刪除