一个好的代码,不仅应该具备较好的可执行性,还应该有较好的可阅读性。

这样,以便于下一个使用者使用你的代码(修改你的bug~

这里我们参考Hadley Wickham 大神给的“良好代码风格”,http://adv-r.had.co.nz/Style.html。它基于google 的R style:https://google.github.io/styleguide/Rguide.xml

作者也推荐了相关的R包,比如formatR,可以帮助我们整理不太“整洁”的代码。

1. 命名

文件名

R 的脚本文件以.R 结尾,需要具有一定的命名意义。

我们可以利用数字,将不同的脚本文件按照一定顺序(流程)对其进行整理:

  1. # Good
  2. fit-models.R
  3. utility-functions.R
  4. 0-download.R
  5. 1-parse.R
  6. 2-explore.R
  7. # Bad
  8. foo.r
  9. stuff.r

变量名

无论是变量还是函数,都应该尽量使用小写字符对其定义。我们可以使用<font style="color:#333333;background-color:#FAFAFA;">_</font> 来分隔名称,并尽量用名词定义变量,动词定义函数(执行某种动作):

并且,我们的命名需要尽量避免与内置函数等重名。
  1. # Good
  2. day_one
  3. day_1
  4. # Bad
  5. T <- FALSE
  6. c <- 10
  7. mean <- function(x) sum(x)

2. 语法

空格

R 要求我们合理的将符号和变量字符隔开,并且空格需要后置于字符串,且不能前置于字符串。

  1. # Good
  2. average <- mean(feet / 12 + inches, na.rm = TRUE)
  3. # Bad
  4. average<-mean(feet/12+inches,na.rm=TRUE)

但有一个特例,当我们使用 :, :: and ::: 的时候,不需要使用空格:

  1. # Good
  2. x <- 1:10
  3. base::get
  4. # Bad
  5. x <- 1 : 10
  6. base :: get

如果括号,则在括号的两侧也需要加上空格,但括号中的字符不需要被分开:

  1. # Good
  2. if (debug) do(x)
  3. plot(x, y)
  4. # Bad
  5. if(debug)do(x)
  6. plot (x, y)
  7. # Bad
  8. if ( debug ) do(x) # No spaces around debug
  9. x[1,] # Needs a space after the comma
  10. x[1 ,] # Space goes after comma not before

缩进

循环或条件下的从句需要进行缩进,且末尾括号需要单独一行,除非是跟着else:

  1. # Good
  2. if (y < 0 && debug) {
  3. message("Y is negative")
  4. }
  5. if (y == 0) {
  6. log(x)
  7. } else {
  8. y ^ x
  9. }
  10. # Bad
  11. if (y < 0 && debug)
  12. message("Y is negative")
  13. if (y == 0) {
  14. log(x)
  15. }
  16. else {
  17. y ^ x
  18. }

如果条件或从句只有一句,可以省去括号:

  1. if (y < 0 && debug) message("Y is negative")
  2. if (y == 0) log(x)

代码长度

通常来说,一行代码应该限制在80个字符以内,但当我们的屏幕大或小的时候,应该进行适当调整,以使用换行进行分隔,R会帮我们识别。以下只是一个例子:

  1. > 1 +
  2. + 2
  3. [1] 3

3. 赋值

使用 <- 而非 = 。= 在传参数时使用。

4. 组织与注释

使用# 注释,注释文字与# 保持空格,使用 --- 使代码区块化(Rstudio 的script 可以折叠):

  1. # Load data ---------------------------
  2. # Plot data ---------------------------

ps:可以学学Rmarkdown~