谷歌的R语言编写规范
R是一个高级编程语言主要用于统计计算和图形。R编程风格指南的目标是使我们的R代码更容易阅读、分享和验证。以下R代码规则是在谷歌的整个R合作用户社区下进行设计的。
一、符号和命名(Notation and Naming)
1.1 文件名(File names)
文件名应该以 (.R) 结尾,当然,还要有意义。
正确示例: predict_ad_revenue.R 
错误示例: foo.R
1.2 身份标识(Identifiers)
不要在标识符中使用下划线(_)或连字符(-)。标识符应根据以下约定命名:1、变量名应该包含所有小写字母和用点(.)分隔的单词;2、函数名称有首字母大写字母,没有点(CapWords);3.常量的名称类似函数,首字母一般为 k。
变量名称
正确示例: avg.clicks 
错误示例: avg_Clicks
函数名称
正确示例: CalculateAvgClicks 
错误示例: calculate_avg_clicks , calculateAvgClicks 
制作功能名称动词。 
例外:创建分类对象时,函数名称(构造函数)和类应该匹配(例如,lm)。
二、语法(Syntax)
2.1 每行最大长度(Line Length)
最大行长度为80个字符。
2.2 缩进(Indentation)
当缩进代码, 使用两个空间。绝不使用制表符或混合制表符和空格。例外:括号内发生换行时,使其与括号内的第一个字符对齐。
2.3 间距(Spacing)
当使用所有二进制运算符(如=,+,-,<,等)在两端空格。例外:当符号 = 是函数调用时的传递参数周围不用空格隔开。 
不要在符号“,”前空格隔开,但需要在“,”后添加空格 
正确示例:
tab.prior <- table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[, 1])
total <- sum(x[1, ]) 
错误示例:
tab.prior <- table(df[df$days.from.opt<0, "campaign.id"])
tab.prior <- table(df[df$days.from.opt < 0,"campaign.id"])
tab.prior<- table(df[df$days.from.opt < 0, "campaign.id"])
tab.prior<-table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[,1])
total <- sum(x[ ,1]) 
在左括号之前添加一个空格,除了函数的调用的情况 
正确示例:
if (debug) 
错误示例:
if(debug) 
如果它改善了等号或箭头(<-)的对齐,则额外的间距(即一行中多于一个空格)是可以的。
plot(x = x.coord,
y = data.mat[, MakeColName(metric, ptiles[1], "roiOpt")],
xlab = "dates",
ylab = metric,
main = (paste(metric, " for 3 samples ", sep = "")))
2.4 花括号(Curly Braces)
一个左括号不应该自己一行; 而一个右括号应该总是一行。当一个代码块是一个单独声明时你可以不适用花括号。但是,你必须考虑其他相同的情况,以保持一致。
if (is.null(ylim)) {ylim <- c(0, 0.06)}
或者
if (is.null(ylim))ylim <- c(0, 0.06)
始终让代码块的主题从新行开始
BAD:
if (is.null(ylim)) ylim <- c(0, 0.06)
if (is.null(ylim)) {ylim <- c(0, 0.06)} 
花括号与else 
一个else语句应该总是被花括号包围在同一行。 
Good:
if (condition) {
 one or more lines
} else {
 one or more lines
} 
Bad:
if (condition) {
 one or more lines
}
else {
 one or more lines
} 
2.5 赋值(Assignment)
使用 <-, 而不使用 =, 用于赋值. 
GOOD:
x <- 5 
BAD:
x = 5 
三、Organization
3.1 总体布局和排序(General Layout and Ordering)
如果每个人都使用相同的一般顺序, 我们能够更快和更容易阅读和理解彼此的脚本。一般开头需包含:
1.版权声明注释
2.作者评论
3.文件描述的评论,包括程序的目的,输入和输出
4.source() 和 library() 声明
5.函数定义
6.已执行的语句
单元测试应该在一个单独的文件名为originalfilename_test.R。
3.2 代码注释(Commenting Guidelines)
简短的注释可以放置在代码之后,用 空格 + # + 空格隔开 ,较长的注释可以单独一行。
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
 breaks = "scott", # method for choosing number of buckets
 xlab = "Fraction of budget spent",
 ylab = "Frequency (count of campaignids)") 
3.3 函数定义和调用(Function Definitions and Calls)
函数定义应该首先列出参数没有默认值, 紧随其后的是那些有默认值的。 
在函数定义和函数调用时,允许多个参数一行,但是换行只允许在参数之间进行。 
GOOD:
PredictCTR <- function(query, property, num.days,
 show.plot = TRUE) 
BAD:
PredictCTR <- function(query, property, num.days, show.plot =
                       TRUE) 
理想情况下,单元测试应该作为样本函数调用(共享库例程)。
3.4 函数说明(Function Documentation)
在函数定义之下应该包含一个分段注释。这些注释应该包含一句关于函数的描述,一段关于该函数的参数列表的的描述(包括数据类型), 和一个返回值的描述。这些注释需具有足够的描述性的,调用者可以通过阅读注释即可懂得如何调用该函数。
Example
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {
  # Computes the sample covariance between two vectors.
  #
  # Args:
  # x: One of two vectors whose sample covariance is to be calculated.
  # y: The other vector. x and y must have the same length, greater than one,
  # with no missing values.
  # verbose: If TRUE, prints sample covariance; if not, not. Default is TRUE.
  #
  # Returns:
  # The sample covariance between x and y.
 n <- length(x)
  # Error handling
  if (n <= 1 || n != length(y)) {
    stop("Arguments x and y have different lengths: ",
 length(x), " and ", length(y), ".")
 }
  if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
    stop(" Arguments x and y must not have missing values.")
 }
 covariance <- var(x, y)
  if (verbose)
 cat("Covariance = ", round(covariance, 4), ".\n", sep = "")
  return(covariance)
} 
四、语言
4.1 连接
使用attach时产生错误的可能性很多,尽量躲开它。
4.2  功能
错误应该使用 stop() 进行提醒
五、最后的话
运用常识,保持一致!
如果您正在编辑代码,请花几分钟查看周围的代码并确定其样式。如果其他人在If子句周围使用空格,你也应该这样做。如果他们的评论周围有小盒子里的星星,你的评论周围也要有小盒子里的星星。
拥有样式指南的关键是拥有一个通用的编码词汇表,这样人们就可以集中精力于您所说的内容,而不是您如何说它。我们在这里介绍全球风格规则,让人们了解词汇。但地方风格也很重要。如果您添加到文件中的代码与周围现有的代码看起来有很大的不同,那么这种不连续性将使读者在阅读时失去节奏。尽量避免这种情况。
好了,写代码的内容就讲到这里;代码本身要有趣得多。享受其中的乐趣!
