在Python中,我习惯于在pep8之后通过一个名为8th Python enhancement proposal的自动但可配置的工具对我的代码进行“样式检查”。
在R我不知道。谷歌有一个style guide,但是:
Dirk,Alex,在你的回答中,你指着我的漂亮的打印机,但在我看来,这将过度一件事而不是另一件事:代码将自动编辑以遵循风格,而没有针对选择不当的标识符发出警告。
我想如果你想要这样一个工具,你可能必须自己写。原因是R没有相当于Python的PEP8;也就是说,一个“官方风格指南”,从高处流传下来,并且普遍由大多数R程序员遵循。
此外,R核心本身存在很多风格上的不一致;这是R作为一种语言进化的方式的结果。例如,R core中的许多函数都遵循foo.bar
的形式,并且在S3对象系统出现之前编写并使用该符号进行方法调度。事后看来,为了保持一致性和清晰度,可能应该更改这些功能的命名,但现在考虑这一点为时已晚。
总之,R没有官方的“样式lint”工具,因为R Core本身包含足够的样式lint,其中没有什么可以做,写一个很难。对于每一条规则---“不要这样做”---必须有一长串的例外 - “除非在这种情况下,这个案例,这一个,......,......是出于历史目的“。
有一个formatR
包与tidy.source
功能。我使用Emacs和ESS,并关注Hadley's style recommendations。将R与Python进行比较是很困难的,因为样式在Python中是强制性的,不像R. =)
编辑 一个简单的演示:
code <- "fn <- function(x, y) { paste(x, '+', y, '-', x+y) }"
tidy.source(text = code)
## not run
fn <- function(x, y) {
paste(x, "+", y, "-", x + y)
}
至于
大多数R程序员实际使用了什么
我怀疑很多人跟随R Core有R Coding standards section in the R Internals manual。
从广义上讲,这些敏感的Emacs默认值与ESS一起使用。这是我使用的,它只是极少改变:
;;; C
(add-hook 'c-mode-hook
;;(lambda () (c-set-style "bsd")))
;;(lambda () (c-set-style "user"))) ; edd or maybe c++ ?
(lambda () (c-set-style "c++"))) ; edd or maybe c++ ?
;;;; 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 t)
至于一般情况,工具Xihui的formatR漂亮的打印机可能确实是最接近的。或者只是使用ESS :)
lint包提供有关风格问题的警告,而不纠正这些问题。运行lint()
命令(使用默认参数值)会为您提供当前目录中所有R文件的警告列表。