作者:Hadley Wickham

翻译:Ewen Wang

来源:Advanced R


标注及名称

文件名称

文件名称应当有意义,并且以 .R 作结。

# Good
fit-models.R
utility-functions.R

# Bad
foo.r
stuff.r

如果是一系列文件,序列号应当在文件之前。

0-download.R
1-parse.R
2-explore.R

对象名称

变量和方程的名称应当是小写。使用下划线(_)来分割名称内的单词。一般而言,变量的名称应当是名次,而方程的名称应当是动词。命名尽量简洁有意义,虽然并非易事。

# Good
day_one
day_1

# Bad
first_day_of_the_month
DayOne
dayone
djm1

如果可能,要避免重复命名。否则,令读者不解。

# Bad
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 或 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 ---------------------------