Next: , Previous: .Internal vs .Primitive, Up: Top



3 R 代码编写标准

R 期望可以在很多平台上运行,包括Linux,Unix的各种变种,32位的Windows版本 以及MacOS X。 因此,无论通过直接加入 R 的基本分发还有通过增加插入式的包来 扩展 R,最好不要依赖一些只有很少平台支持的属性,如果避免的话。 特别,尽管大多数R开发人员使用 GNU 工具, 他们最好不要用 GNU 的扩展成为标准工具。 尽管一些其它的软件包明确依赖于 GNU make 或 GNU C++ 编译器一类的软件, R 则不需要。 然而,R 是一个 GNU 项目, GNU 代码编写标准的精髓要尽量符合。

下面的工具可以在写R的扩展时可以被“安全地假定”。

在Windows里面,大多数用户不会安装这些工具,在操作你的包的时候, 你不需要它们的存在。但是,用户如果从源码安装你的包,他们就需要这些工具, 因为已经假定他们已经按“R安装和管理”(R Installation and Administration)手册附录里面 的“Windows工具集”部分获得这些工具了。 重定向不能指望通过命令 system 获得, 因为它不使用标准的SHELL脚本 (不管Bourne SHELL)。

此外,在一些特定工作的时候,还需要下面的工具。

代码最好以一种其他人可以理解的方式编写。这点也是比较重要的。 在修补问题特别有用。同时,还要以自我描述的方式给变量命名, 注释代码和对代码适当格式化。 R核心开发小组推荐使用 4作为R和C(也包括PERL)代码的基本缩排方式,2作为 Rd 形式的文档的缩排方式。 Emacs 用户可以把下面的部分放在他们的启动文件中 实现这种缩排方式。 (对于 GNU Emacs 20:对于 GNU Emacs 21 或后续版本,or later 设置 c-default-style"bsd"c-basic-offset4。)

     ;;; C
     (add-hook 'c-mode-hook
               (lambda () (c-set-style "bsd")))
     ;;; ESS
     (add-hook 'ess-mode-hook
               (lambda ()
                 (ess-set-style 'C++)
                 ;; Because
                 ;;                                 DEF GNU BSD K&R C++
                 ;; ess-indent-level                  2   2   8   5   4
                 ;; ess-continued-statement-offset    2   2   8   5   4
                 ;; ess-brace-offset                  0   0  -8  -5  -4
                 ;; ess-arg-function-offset           2   4   0   0   0
                 ;; ess-expression-offset             4   2   8   5   4
                 ;; ess-else-offset                   0   0   0   0   0
                 ;; ess-close-brace-offset            0   0   0   0   0
                 (add-hook 'local-write-file-hooks
                           (lambda ()
                             (ess-nuke-trailing-whitespace)))))
     (setq ess-nuke-trailing-whitespace-p 'ask)
     ;; or even
     ;; (setq ess-nuke-trailing-whitespace-p t)
     ;;; Perl
     (add-hook 'perl-mode-hook
               (lambda () (setq perl-indent-level 4)))

(Emacs的C和R模块的`GNU'格式使用的基本缩进为2, 但这样在窄字符的时候让结构不甚明了。)