天天看點

《R的極客理想—工具篇》—— 1.4 formatR 代碼自動化排版

本節書摘來自華章出版社《r的極客理想—工具篇》一 書中的第1章,第1.4節,作者:張丹,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

問題

如何寫出讓别人看得懂,且符合規範的代碼呢?

《R的極客理想—工具篇》—— 1.4 formatR 代碼自動化排版

引言

新手寫的代碼,大都不注重代碼規範,以為實作功能就算完成了。這種代碼不僅别人不願意讀,過幾個月後再看自己都會覺得很爛。不僅僅新手如此,大多數程式員寫的代碼都沒有考慮如何讓别人看着更友善。程式員最痛苦的事情,不是每天加班寫程式,而是每天加班讀懂别人寫的程式。最後,有人實在忍受不了其他人的醜陋代碼,便開始制定代碼程式設計規範,又有人去實作代碼的自動化排版工具。formatr就是這樣的一個r語言自動化排版的工具。

formatr包是一個實用的包,提供了r代碼格式化功能,可以自動設定空格、縮進、換行等代碼格式,讓代碼看起來更友好。formatr包中的api中主要有下面5個函數。

tidy.source: 對代碼進行格式化

tidy.eval: 輸出格式化後的r代碼和運作結果

usage: 格式化函數定義,并按指定寬度輸出

tidy.gui: 一個gui工具,支援編輯并格式化r代碼

tidy.dir: 對某個目錄下,所有r腳本進行格式化

本節使用的系統環境是:

win7 64bit

r: 3.0.1 x86_64-w64-mingw32/x64 b4bit

注 formatr同時支援windows 7環境和linux環境。

formatr的安裝過程如下:

字元串格式化

通過執行tidy.source()函數,把代碼進行了重新格式化,讓我們一眼就可以看得懂。

檔案格式化

messy.r是一個不太規範的r程式檔案。我們讀入這個檔案,然後通過tidy.source()函數,以檔案對象作為輸入參數,進行代碼格式化。

格式化後的代碼輸出:

可以看出,格式化後的輸出,經過了空格、縮進、換行、注釋等處理,代碼可讀性就增強了。

格式化并輸出r腳本檔案

建立r腳本檔案demo.r。

輸出格式化結果到檔案demo2.r,如圖1-3所示。

《R的極客理想—工具篇》—— 1.4 formatR 代碼自動化排版

輸出格式化代碼和運作結果

使用tidy.eval()函數,以字元串形式,執行r腳本:

這樣直接在目前的運作環境中,就輸出了代碼和運作結果。

格式化函數定義

通過usage()函數可以隻列印出函數定義,跳過函數細節。以var()函數為例,輸入var,預設會列印出一個函數細節。

有時候函數定義也很長,比如lm()函數,通過usage的width參數可以控制函數的顯示寬度。

gui工具

tidy.gui()函數是一個gui的工具,可以在界面上編輯并格式化r代碼。首先安裝gwidgetsrgtk2庫:

我們輸入一段不太好看的代碼,如圖1-4所示。

《R的極客理想—工具篇》—— 1.4 formatR 代碼自動化排版

點選“轉換”,結果如圖1-5所示,可以看到,在gui的編輯器中,r語言的代碼被格式化了!

圖1-5 格式化後的代碼

格式化目錄中的檔案

tidy.dir()函數可以批量格式化檔案,對目錄中的所有檔案進行格式化操作。下面建立目錄:dir,并在目錄dir中建立兩個r腳本檔案:dir.r, dir2.r。

我們發現不規則的代碼,已經被格式化了!

通過上面的使用,我們不難發現,formatr包的核心函數就是tidy.source()函數,從github上面找到源代碼:github.com/yihui/formatr/blob/master/r/tidy.r。我将在代碼中增加注釋:

在讀源代碼的過程中,我發現有一個小問題,即在r 3.0.1版本,沒有對向右指派操作(->)進行處理。我已經就這個問題給作者提bug了,參見github.com/yihui/formatr/issues/31。bug測試代碼如下:

formatr包提供的功能非常實用,特别是讀别人寫的不規範的代碼的時候。建議各ide廠商能把formatr作為标準的格式化工具直接嵌入編輯器的工具中。讓我們把閱讀别人的代碼,也變成一件快樂的事情吧。

繼續閱讀