风格指南
好的代码风格犹如使用正确的标点符号。你可以不在意,但是它确实能提高你代码的可读性。正如标点符号的不同使用方式,R代码也有不同的编写风格。下面的指南是我编写R的代码风格,是基于Google的R风格指南修改的。你不必使用我的这套风格,但是你应该使用一套一致的风格。
尽管你的代码只有一个作者,但是它将会有好几位读者。所以好的代码风格非常重要。当你和别人合作编码时,这就更重要了,所以事先最好先确定一个一致的代码风格。严格来讲,没有哪种风格是最好的,这意味着当你和别人合作时,你可能需要牺牲一些你偏好的风格。
谢益辉编写的formatR包能帮助整理你的R代码。这个包也不是万能的,但是至少它可以将你糟糕的代码迅速变得整洁漂亮。在使用formatR包前最好先读一读它的引言。
注释和命名
文件名
文件名应该有意义并且以.R
结尾。
# 好的文件命名
fit-models.R
utility-functions.R
# 坏的文件命名
foo.r
stuff.r
如果文件需要顺序运行,可以用数字作为文件名的前缀的标记:
0-download.R
1-parse.R
2-explore.R
对象名
“计算机科学有两大难点:缓存效验和对象命名。”
--- Phil Karlton
变量和函数名应该用小写。在名字中使用下划线(_
)来分隔单词。通常变量名使用名词,函数名使用动词。尽量使用精炼易懂的名字(这个不容易!)。
# 好名字
day_one
day_1
# 坏名字
first_day_of_the_month
DayOne
dayone
djm1
尽量不要取和已有函数和变量相同的名字,以避免让读代码的人混淆。
# 不好的例子
T <- FALSE
c <- 10
mean <- function(x) sum(x)
语法
空格
在所有的操作符(=
, +
, -
, <-
, 等)前后都插入空格。 同样在使用=
来调用函数时也在前后插入空格。凡是在逗号后面都添加上空格,前面不加(就像一般的英语书写格式)。
# 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个字符左右。这样便于将你的代码打印出来。如果你发现你的代码超出了这个范围,这或许是个好的提醒让你用另外的函数来实现这块代码。
缩进
最好用两个空格来缩进你的代码,避免使用制表符(tab)或制表符与空格的混合。
有一个例外是,当一个函数的定义占用多行时,则缩进下一行到与函数定义的开始端对齐:
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
管理
注释指南
每一行注释以注释符号和一个空格开始:#
。注释用来解释为什么而不是是什么。
使用带有-
或=
的注释行来分隔你的代码。
# Load data ---------------------------
# Plot data ---------------------------