252010
邱童鞋眼尖,我刚往CRAN发了个R包没几天就被发现了。很久很久以前,source()函数是可以输出干净整齐的R代码的,但从某个R版本开始,这项功能被去掉了,让我感到很不爽,于是乎,研究了一下前一个版本的R源文件,悟出了整理代码的本质,于是操刀写了一个清理代码的函数;很久以前,小邱想出了一个聪明的办法,使得这个函数可以保留某些注释语句(以前这个函数只能去掉所有注释);几天前,我在看gWidgets包的同时,为这个函数写了个界面。一个新的R包formatR就诞生了。

很多人写R代码都不管代码是否整齐可读,也许是没有受够读代码的折磨:本来读别人的代码就是很痛苦的事情,如果代码写得不整齐,就更要命了。幸好R可以自己处理自己的代码,以R攻R,就可以得到自动整理的整齐代码了。

这个包的界面很简略,就是一个文本框加上若干按钮。以下是效果图:

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)
## 将自动启动界面

第二个版本中加入了执行代码、字体设置以及其它选项。需要提醒的有两点:

  1. 这个代码清理功能只能保留整行的注释(也就是单独占一行的注释),行内注释会被删掉。
  2. 目前暂时还没搞清楚中文编码的问题,所以暂不支持中文,如果代码中有中文,将会被转换为乱码。有谁熟悉gWidgets的话可以帮帮我。

爷还想看:

16 Responses to “formatR:格式化R代码的R包”

Comments (16)
  1. tengfei 说:

    这个东西好,我正头疼平时有时候整理自己格式的时候,用tab实在恼人,若问下这个包有没有command line的方法,可以直接比如 formatR(file=’XXX.R’), 然后就覆盖了源文件,或者formatRDir(dir=’xxx’),所有都给整理了。这样就更方便了。。。我是不是有点贪婪啊,嘿嘿

    • yixuan 说:

      核心的算法在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 = '')))

  2. Feng Li 说:

    不错,为什么这样做呢?

    ## file tidy.R
    options(keep.source = FALSE)
    source("your_code.R")
    dump(ls(all=TRUE), file = "new.your_code.R")
    

    然后

    R --vanilla < tidy.R
    
    • 谢益辉 说:

      你的tidy.R只是执行your_code.R代码并以dump的方式保存结果,没有整理源代码的功能。source()函数的keep.source选项如果为TRUE(默认),那么source(…, echo = TRUE)会给你去掉注释的R代码;若keep.source = FALSE,那么source()会给你原样返回代码,也就是没有经过清理的代码(注释语句不会被去掉)。要么让R整理代码并丢弃注释,要么不整理代码,tidy.source()解决的就是这个两难问题,既保留注释语句,又能整理代码。

  3. wills.an 说:

    有几天没来这里看看了,发现博客的主题换了啊。

    老谢,这个主题叫什么名字?

    这个主题挺利索的呀。

  4. 很实用。尤其是处理遗留代码时。

  5. yixuan 说:

    乱码的问题似乎可以用Encoding()函数解决,在有乱码的地方设置成UTF-8就行了,我在Windows下测试情况还好,修改的源码在这里。有个小问题是使用gfile()后R里面会自动打印出路径,这个乱码还没法解决。

    • 谢益辉 说:

      奇怪了,在我的Win上这个乱码问题始终没法解决,我猜也是Encoding()iconv()之类的函数,但就是不成功。只有一种情况可以,就是Sys.setlocale(locale = 'C'),但这样设置之后中文注释最后会多出来一个括号),不知道为什么……

      • yixuan 说:

        我的R是用默认的中文界面,跟这个有关吗?

        • 谢益辉 说:

          我换成了中文界面也没用。怪哉怪哉……

          > sessionInfo()
          R version 2.10.1 (2009-12-14)
          i386-pc-mingw32 
          
          locale:
          [1] LC_COLLATE=Chinese_People's Republic of China.936
          [2] LC_CTYPE=Chinese_People's Republic of China.936
          [3] LC_MONETARY=Chinese_People's Republic of China.936
          [4] LC_NUMERIC=C
          [5] LC_TIME=Chinese_People's Republic of China.936    
          
          attached base packages:
          [1] stats     graphics  grDevices utils     datasets  methods   base     
          
          other attached packages:
          [1] gWidgetsRGtk2_0.0-64 formatR_0.1-4        animation_1.1-1      MASS_7.3-5
          [5] gWidgets_0.0-40     
          
          loaded via a namespace (and not attached):
          [1] RGtk2_2.12.18 tools_2.10.1
          
  6. vulpecula 说:

    用emacs吧, 不管什么都给你整理好了 ;-)

    • 谢益辉 说:

      我也是一直想用Emacs+ESS,不过这东西对新手来说实在有点门槛,尝试多干次,都以放弃告终……

      • vulpecula 说:

        Emacs的设置在windows下面是有些麻烦, 不过在Mac或者Linux下面几乎不用操心, 装上就能用.

Leave a Reply

(required)

(required)

WWW.YIHUI.NAME XIE@YIHUI.NAME © 2007 - 2010 by Yihui Xie