R是一个高级编程语言主要用于统计计算和图形。R编程风格指南的目标是使我们的R代码更容易阅读、分享和验证。以下R代码规则是在谷歌的整个R合作用户社区下进行设计的。
符号和命名(Notation and Naming)
文件名(File names)
File names should end in .R and, of course, be meaningful.
GOOD: predict_ad_revenue.R
BAD: foo.R
标识符(Identifiers)
不要使用下划线(_)或连字符(-)标识符。标识符应按照以下命名约定。变量名的首选形式都是小写字母和单词分开用点(variable.name),但也接受variableName;函数名最初的大写字母和没有点(FunctionName);
**variable.name** is preferred, variableName is accepted
GOOD: avg.clicks
OK: avgClicks
BAD: avg_Clicks
FunctionName
GOOD:
CalculateAvgClicks
BAD:
calculate_avg_clicks , calculateAvgClicks
Make function names verbs.
Exception: When creating a classed object, the function name
语法(Syntax)
每行最大长度(Line Length)The maximum line length is 80 characters.
缩进(Indentation)
当缩进代码, 使用两个空间。绝不使用制表符或混合制表符和空格。例外:括号内发生换行时,使其与括号内的第一个字符对齐。
间距(Spacing)
当使用所有二进制运算符(如=,+,-,<,等)在两端空格。例外:当符号 = 是函数调用时的传递参数周围不用空格隔开。
不要在符号“,”前空格隔开,但需要在“,”后添加空格
GOOD:
tab.prior <- table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[, 1])
total <- sum(x[1, ])
BAD:
tab.prior <- table(df[df$days.from.opt<0, "campaign.id"]) # Needs spaces around '<'
tab.prior <- table(df[df$days.from.opt < 0,"campaign.id"]) # Needs a space after the comma
tab.prior<- table(df[df$days.from.opt < 0, "campaign.id"]) # Needs a space before <
tab.prior<-table(df[df$days.from.opt < 0, "campaign.id"]) # Needs spaces around <
total <- sum(x[,1]) # Needs a space after the comma
total <- sum(x[ ,1]) # Needs a space after the comma, not before
在左括号之前添加一个空格,除了函数的调用
GOOD:
if (debug)
BAD:
if(debug)
Extra spacing (i.e., more than one space in a row) is okay if it improves alignment of equals signs or arrows (<-).
plot(x = x.coord,
y = data.mat[, MakeColName(metric, ptiles[1], "roiOpt")],
xlab = "dates",
ylab = metric,
main = (paste(metric, " for 3 samples ", sep = "")))
花括号(Curly Braces)
一个左括号不应该自己一行; 而一个右括号应该总是一行。当一个代码块是一个单独声明时你可以不适用花括号。但是,你必须考虑其他相同的情况,以保持一致。
if (is.null(ylim)) { ylim <- c(0, 0.06) }
xor (but not both)
if (is.null(ylim)) ylim <- c(0, 0.06)
Always begin the body of a block on a new line.
BAD:
if (is.null(ylim)) ylim <- c(0, 0.06)
if (is.null(ylim)) {ylim <- c(0, 0.06)}
1
2
花括号与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
}
赋值(Assignment)
Use <-
, not =
, for assignment.
GOOD:
x <- 5
BAD:
x = 5
总体布局和排序(General Layout and Ordering)
如果每个人都使用相同的一般顺序, 我们能够更快和更容易阅读和理解彼此的脚本。一般开头需包含:
版权声明注释
作者评论
文件描述的评论,包括程序的目的,输入和输出
source() 和 library() 声明
函数定义
已执行的语句
单元测试应该在一个单独的文件名为originalfilename_test.R。
代码注释(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)")
函数定义和调用(Function Definitions and Calls)
函数定义应该首先列出参数没有默认值, 紧随其后的是那些有默认值的。
在函数定义和函数调用时,允许多个参数一行,但是换行只允许在参数之间进行。
GOOD:
PredictCTR <- function(query, property, num.days,
show.plot = TRUE)
BAD:
PredictCTR <- function(query, property, num.days, show.plot =
TRUE)
理想情况下,单元测试应该作为样本函数调用(共享库例程)。
函数说明(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)
}
Functions
错误应该使用 stop() 进行提醒