天天看点

《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作为标准的格式化工具直接嵌入编辑器的工具中。让我们把阅读别人的代码,也变成一件快乐的事情吧。

继续阅读