风格指南

好的代码风格犹如使用正确的标点符号。你可以不在意,但是它确实能提高你代码的可读性。正如标点符号的不同使用方式,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 ---------------------------

results matching ""

    No results matching ""