三 252010
小邱童鞋眼尖,我刚往CRAN发了个R包没几天就被发现了。很久很久以前,
source()函数是可以输出干净整齐的R代码的,但从某个R版本开始,这项功能被去掉了,让我感到很不爽,于是乎,研究了一下前一个版本的R源文件,悟出了整理代码的本质,于是操刀写了一个清理代码的函数;很久以前,小邱想出了一个聪明的办法,使得这个函数可以保留某些注释语句(以前这个函数只能去掉所有注释);几天前,我在看gWidgets包的同时,为这个函数写了个界面。一个新的R包formatR就诞生了。
很多人写R代码都不管代码是否整齐可读,也许是没有受够读代码的折磨:本来读别人的代码就是很痛苦的事情,如果代码写得不整齐,就更要命了。幸好R可以自己处理自己的代码,以R攻R,就可以得到自动整理的整齐代码了。
这个包的界面很简略,就是一个文本框加上若干按钮。以下是效果图:
感兴趣的客官可以从svn获得最新源代码自行编译安装,注意这个包依赖于gWidgetsRGtk2包:
svn checkout svn://svn.r-forge.r-project.org/svnroot/animation/pkg/formatR R CMD INSTALL formatR
初级用户可以从CRAN安装(CRAN上的版本取决于我的提交,可能会有延迟):
## 启动R,然后
install.packages('formatR')
library(formatR)
## 将自动启动界面
第二个版本中加入了执行代码、字体设置以及其它选项。需要提醒的有两点:
- 这个代码清理功能只能保留整行的注释(也就是单独占一行的注释),行内注释会被删掉。
- 目前暂时还没搞清楚中文编码的问题,所以暂不支持中文,如果代码中有中文,将会被转换为乱码。有谁熟悉gWidgets的话可以帮帮我。
爷还想看:
16 Responses to “formatR:格式化R代码的R包”
Comments (16)


这个东西好,我正头疼平时有时候整理自己格式的时候,用tab实在恼人,若问下这个包有没有command line的方法,可以直接比如 formatR(file=’XXX.R’), 然后就覆盖了源文件,或者formatRDir(dir=’xxx’),所有都给整理了。这样就更方便了。。。我是不是有点贪婪啊,嘿嘿
核心的算法在animation包的tidy.source()中,你可以再加上一些write()之类的函数来实现。
如楼上所说,你可以
sapply(list.files(YOUR.DIR, pattern = '\\.(R|r)'), function(x) tidy.source(x, file = x)),这样就能把YOUR.DIR文件夹下的所有R代码文件都清理了,不过这种方式会覆盖原文件,如果不希望覆盖的话,可以给file另外的文件名,如sapply(list.files(YOUR.DIR, pattern = '\\.(R|r)'), function(x) tidy.source(x, file = paste('tidy_', x, sep = '')))。谢谢各位的耐心解释!!我试试去~~
不错,为什么这样做呢?
## file tidy.R options(keep.source = FALSE) source("your_code.R") dump(ls(all=TRUE), file = "new.your_code.R")然后
你的tidy.R只是执行your_code.R代码并以dump的方式保存结果,没有整理源代码的功能。source()函数的keep.source选项如果为TRUE(默认),那么source(…, echo = TRUE)会给你去掉注释的R代码;若keep.source = FALSE,那么source()会给你原样返回代码,也就是没有经过清理的代码(注释语句不会被去掉)。要么让R整理代码并丢弃注释,要么不整理代码,tidy.source()解决的就是这个两难问题,既保留注释语句,又能整理代码。
有几天没来这里看看了,发现博客的主题换了啊。
老谢,这个主题叫什么名字?
这个主题挺利索的呀。
叫Suffusion,很强大的一个主题,可定制的选项非常多
很实用。尤其是处理遗留代码时。
乱码的问题似乎可以用Encoding()函数解决,在有乱码的地方设置成UTF-8就行了,我在Windows下测试情况还好,修改的源码在这里。有个小问题是使用gfile()后R里面会自动打印出路径,这个乱码还没法解决。
奇怪了,在我的Win上这个乱码问题始终没法解决,我猜也是
Encoding()或iconv()之类的函数,但就是不成功。只有一种情况可以,就是Sys.setlocale(locale = 'C'),但这样设置之后中文注释最后会多出来一个括号),不知道为什么……我的R是用默认的中文界面,跟这个有关吗?
我换成了中文界面也没用。怪哉怪哉……
用emacs吧, 不管什么都给你整理好了
我也是一直想用Emacs+ESS,不过这东西对新手来说实在有点门槛,尝试多干次,都以放弃告终……
Emacs的设置在windows下面是有些麻烦, 不过在Mac或者Linux下面几乎不用操心, 装上就能用.