我习惯于在pep8之后通过一个名为8th Python enhancement proposal的自动但可配置的工具对我的代码进行“样式检查”。
在R我不知道。 Google有一个style guide,但是:Dirk,Alex,在你的回答中,你指着我的漂亮的打印机,但在我看来,这将超过一件事,而不是另一件事:代码将自动编辑以遵循风格,而没有发出警告,选择不当的标识符
答案 0 :(得分:21)
有一个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)
}
答案 1 :(得分:11)
我想如果你想要这样一个工具,你可能需要自己编写。原因是R没有相当于Python的PEP8;也就是说,一个从高处传下来的“官方风格指南”,大多数R程序员都普遍遵循这个指南。
此外,R核心本身存在很多风格上的不一致;这是R作为一种语言进化的方式的结果。例如,R core中的许多函数都遵循foo.bar
的形式,并且在S3对象系统出现之前编写,并使用该符号进行方法调度。事后看来,为了保持一致性和清晰度,可能应该更改这些功能的命名,但现在考虑这一点为时已晚。
总之,R没有官方的“样式lint”工具,因为R Core本身包含足够的样式lint,其中没有什么可以做的,写一个很难。对于每一条规则---“不要这样做”---必须有一长串的例外 - “除非在这种情况下,这个案例,这一个,......,......是出于历史目的“。
答案 2 :(得分:6)
至于
大多数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:)
答案 3 :(得分:4)
lint包提供有关样式问题的警告,而不对其进行更正。
运行lint()
命令(使用默认参数值)会为您提供当前目录中所有R文件的警告列表。
答案 4 :(得分:4)
lintr - 突出显示可能的语法和样式问题/错误
CRAN Task View: Reproducible Research - 格式工具部分包含其他有用的工具,尤其是formatR,可自动生成代码。
答案 5 :(得分:2)
styler
转换您的代码库以匹配给定的样式 - 默认值与here描述的tidyverse样式相匹配。它修改了对齐和一些语法(&lt; - over =)。但是,它不会重命名变量或类似的东西。
lintr
未修改。它只标识与您的样式指南不一致的代码行。当我在一个软件包或项目上工作时,我在vim中使用它来识别需要更多人工输入来修复的东西(重命名变量/函数等)
答案 6 :(得分:0)