1. 文件命名
- 文件的命名(File Names)
文件的命名应该以.R为结尾,并且应该有意义(你要干什么)
GOOD: predict_ad_revenue.R
BAD: foo.R - 标志符(Identifiers)
标志符的命名分为变量的命名和函数的命名。
在标志三符中不要使用_和-。标志符的命名应该遵循一贯的原则。原则如下:
- 变量的命名(variable.name):全部用小写字母,字(word)与字(word)之间应该用小黑点(.)隔开
GOOD: avg.clicks
BAD: avg_Clicks , avgClicks - 函数的命名(FunctionName):每一个字(word)的首个字符大写,字与字之间没有间隔.
GOOD: CalculateAvgClicks
BAD: calculate_avg_clicks , calculateAvgClicks
每一个函数的命名要以动词开始(做什么事)
例外情况:当创建一个类的对象,构造器(constructor) 和类名应该保持一致。(所有的面向对象应该都适用) - 常量的命名(kConstantName):和函数命名方式一样,除了最前面要加一个小写的k.
2. 语法(Syntax)
- 每一代码行的长度
最大的长度不能超过80个字符 - 首行缩进
当缩进你的代码时,使用两个空格的长度。禁忌:不要使用TAB键或空格和TAB混合方式
例外情况: Exception: When a line break occurs inside parentheses, align the wrapped line with the first character inside the parenthesis.(翻译不出来,前后语意应该保持一致)
可能翻译如下(猜测):当括号中的代码太多,你准备写成两行或者多行的时候,那么保证下一行的开始部分与该括号第一个字符列对齐。
如下: - 上面实例出自说明文档,大部分内容都是在一个括号内,但是不同行和括号的开头部分是列对齐的。上面这段话也说明一个技巧:
R的帮助文档很强大,如果在code style 上有疑惑,则查询帮助文档即可。 - 空格
请在所有的二元操作符(+, -, *, <-, etc)两边都加上空格.
逗号前一定不能有空格,逗号后一定得有空格。
(上面那个例子,注意看等号。)
GOOD:
tabPrior <- table(df[df$daysFromOpt < 0, “campaignid”]) #说明[并不是一个二元操作符。
total <- sum(x[, 1])
total <- sum(x[1, ])
BAD: - 左括号前面,要加一个空格,除了调用函数的时候。
例外情况:Exception: Spaces around =’s are optional when passing parameters in a function call.
这里并不知道 =’s 指的是什么?s指的是space
可能翻译:
在函数调用的时候,函数中等号左右的space是可选的。(应该对于所有的语言都是适用的)
GOOD:
if (debug)
BAD:
if(debug)
有些情况下,可以使用多个空格,如果多个行需要对齐的时候(使用“=”或者”->”的时候),如下:
在括号中( 括号和中括号 (),[] ),代码左右是不能留空格的 - 例外情况:在逗号的后面
GOOD: - BAD:
- 大括号
大括号中包含的是一个代码块
{:开始大括号不能单独占一行
}: 结束大括号必须占一行
当大括号中只有一个命令行的时候,可以不使用大括号,但是整篇代码大括号的使用规则要保持一致。
如下: - 如果开始新的代码块的时候,则一定要使用新的一行作为开始。
BAD: - 赋值
在赋值的时候,使用“->”号,不要使用”=”号
GOOD:
x <- 5
- BAD:
x = 5
- 分号
当一行代码结束的时候,不要使用分号
不要使用分号将多个命令行变成一行。(在R的代码中,能不使用分号就不要使用分号)
3.代码的组织
- 整体布局与顺序
目的:如果大家都使用相同的布局规则,那么阅读他人代码要快速和容易一些。
- 版权声明(现在是不需要的)
- 作者的声明
- 文件的声明,包括程序的目的,输入和输出
- source()和library() 的声明(statements)
- 函数的定义
- 执行语句(such as:print,plot), 如果可行的话(这一句话可能翻译有误)测试单元应该专门写在一个单独的文件之中,命名为originalfilename_unittest.R.(这个我可能有用)
- 注释指导(Commenting Guidelines 如何写注释)
- 当注释你的代码的时候,所有的注释都应该以#开头,并空一个空格。
- 短注释应该和代码同行,而后空两个空格,以#开头,空一个空格,随后写注释。
实例如下:
- 函数定义和调用
- 在定义函数写参数的时候,要先列出没有默认值的函数参数,随后列出有默认值的参数。要注意先后顺序。(注意前后统一) 在函数的定义和调用的时候,参数写多行是被允许的。那么在什么时候要新开设一行呢?有赋值语句出现的时候(函数中有默认参数)
实例: - Ideally, unit tests should serve as sample function calls (for shared
library routines)
如何翻译?理想情况下,单元测试为简单函数调用服务(为了共享库的路径)
- (函数的说明文档)Function Documentation
一个完整的函数应该包含相应的说明文档。
这个说明文档在函数定义行之后(函数体的最前面)
- 一句话说明函数的作用是什么
- 说明参数的作用,使用Args:开头,接下来一行是一个参数,要说明参数的数据类型和参数的含义。
- 说明返回值,以Returns:开头
总的原则是:不用看函数的代码,就能大致明白与函数相关的必要信息。
示例:
注意: 不是所有的函数都要写注释,这点要记住。
- TODO style(什么意思?之前没见过)
Use a consistent style for TODOs throughout your code.
TODO(username): Explicit description of action to be taken
做什么?不懂
4. 语言
- Attach
不要使用Attach,它的益处远远小于其带来的弊端。
在使用data.frame的时候,有时会使用Attach,这样在调用数据的时候,可以简化代码。
(这个会引起不必要的麻烦,使用data.table吧) - 函数(Functions)
Errors should be raised using stop().
错误的抛出应该使用stop().**(如何使用stop?) - (目标和方法)Objects and Methods
R有两种类,S3类和S4类,原则是:能不使用S4类就尽量不使用。
5. 例外的情况
写代码的时候,你应该尽量遵守上面的规则,除非有更好的理由用其他的方式。
例外情况包括:别人遗留下的代码或者修改第三方的代码
6. 临别赠言
使用约定俗成的规则,并且尽量保持代码风格一致。
如果你在修改代码,花几分钟看看代码,并确定风格。原则就是你要和以后的代码保持一致。
上面的规则只是全局规则,至于局部规则(local rule 也非常重要),要与已有代码保持一致,不要显得太突兀。