摘录:Hadley Wickham在《advanced R》书中,基于Google's R style guide做了总结和示例。以下为全文(英文原地址)的摘录翻译。
好的R代码很重要,因为代码往往会被其他人阅读。formatR
包(作者Yihui Xie)可以让丑的代码变得好很多。可以尝试用用。
注释和命名
文件名
文件名要有意义,代码文件并以.R
结束。数据文件以.RData
结束。
# Good
fit-models.R
utility-functions.R
# Bad
foo.r
stuff.r
如果需要按顺序运行代码文件,加上数字前缀。
0-download.R
1-parse.R
2-explore.R
对象命名
变量名,小写,可用_
隔开单词。
函数名,首字母小写,第二及后面词首字母大写。
一般,变量名字应是名字,而函数名应是动词。
# Good variables
day_one
day_1
#Good function
displayPlotAgain()
# Bad
first_day_of_the_month
DayOne
dayone
djm1
最好不要用已存在的变量和函数名。
# Bad
T <- FALSE
c <- 10
mean <- function(x) sum(x)
函数的参数命名,以.
间隔单词。这样函数参数与变量名可以区别开。
# Preferred
buildCyc(num.frames=10)
buildCyc(num.frames=num_frames)
# Discouraged
buildCyc(num_frames=10)
buildCyc(numframes=10)
buildCyc(numFrames=10)
语法
空格
- 中缀运算符(比如
=
,+
,-
,<-
等)前后要空格。 - 函数调用中的
=
前后要有空格 - 逗号后一个空格,前面无空格
# Good
average <- mean(feet / 12 + inches, na.rm = TRUE)
# Bad
average<-mean(feet/12+inches,na.rm=TRUE)
但:
,::
,:::
是例外,它们前后都不要有空格。
# Good
x <- 1:10
base::get
# Bad
x <- 1 : 10
base :: get
除了调用函数,其他时候的左括号前留一个空格。
# Good
if (debug) do(x)
plot(x, y)
# Bad
if(debug)do(x)
plot (x, y)
为了对齐而增加等号或赋值符前后的空格是可以的。
list(
total = a + b + c,
mean = (a + b + c) / n
)
不要在括号或中括号中随意加空格,除非上面的情况(有逗号)。
# Good
if (debug) do(x)
diamonds[5, ]
# Bad
if ( debug ) do(x) # No spaces around debug
x[1,] # Needs a space after the comma
x[1 ,] # Space goes after comma not before
花括号
{
不要单独开启一行,而应该在之后另起一行。
}
应该单独一行。除非它跟在else
后面。
# Good
if (y < 0 && debug) {
message("Y is negative")
}
if (y == 0) {
log(x)
} else {
y ^ x
}
# Bad
if (y < 0 && debug)
message("Y is negative")
if (y == 0) {
log(x)
}
else {
y ^ x
}
可以将很短的语句放在同一行。
if (y < 0 && debug) message("Y is negative")
行宽
尽量每行少于80个字符。如果你发现写代码的空间不够用了,说明你需要把一些代码放在另一个函数中。
缩进
缩进两个空格。
除非定义函数的时候,可以对齐。
long_function_name <- function(a = "a long argument",
b = "another argument",
c = "another long argument") {
# As usual code is indented by two spaces.
}
赋值
用<-
赋值,而不是=
。
# Good
x <- 5
# Bad
x = 5
注释
每个注释应以一个井号和一个空格开始。每一行注释前后各空一行。完整的句子,大写字母开头,句号结尾。
注释应解释为什么,而不是什么。
# How many locations are represented in the dataset.
ds$location %>%
unique() %>%
length()
# Identify variables that have a single value.
ds[vars] %>%
....
code sections可以全大写标题开始。注释行如果以多于四个的-,=,#结束,就创建了一个code section。不同的code section可以通过 Jump To菜单切换。
# Section One ---------------------------------
# Section Two =================================
### Section Three #############################
关于R style的包
styler
styler包地址
styler包可以自动将代码转换成符合规定的代码形式。装好后,Rstudio的插件中可以找到。适合已经完成的代码一键转换。
lintr
install.packages("lintr")
菜单栏"Tools" -> "Global Options..."-> "Code" -> "Diagnostics" 标签:check "Show diagnostics for R".
lint一个R文件lintr::lint("test.R")
,诊断信息在Marker panel中。
这个包也包含两个插件。可以将插件和快捷方式绑定: Tools > addins > Browse Addins > Keyboard Shortcuts. 建议用Alt+Shift+L
for linting the current source code and Ctrl+Shift+Alt+L
to code the package.