R语言编程规范
R语言编程规范(R Coding Conventions)(RCC)是伯克利(Berkeley)大学Henrik Bengtsson教授撰写的,旨在规范R语言编程,使程序更具可读性,本文既针对RCC中的重点进行总结和梳理。
1. 变量命名规范
- 变量或者类命名中不带.,但可以作为前缀;e.g.
.Machine
,filePrefix
而不是File.Prefix
; - 变量或者类命名最好是名词或名词组合,且各名词首字母大写(建议第一个名词首字母不需要大写),e.g.
fileName
而不是filename
; - 常量用全大写字母表示,e.g.
MAX_ITERATIONS
或COLOR.RED
; - 变量命名尽量少用缩写,e.g.
fileName
而不是flNm
,但某些约定俗成的词最好还是保留缩写,但首字母大写外,其余都用小写,Html
而不是HTML
,也不是HyperTextMarkupLanguage
; - 临时变量要尽量短,让读者明确该变量仅在某几行代码内有效,e.g.
i
或ii
而不是iterationNumber
; - 变量命名要有可读性,e.g.
okButton
、mainWindow
或leftScrollbar
而不是Flag
或variable
; - 变量命名时要突出某些变量的类型,如矩阵、列表,e.g. 如果
matrixElement
代表矩阵的某一个元素,需要使用matrixElementList
代表矩阵元素列表,而不是使用matrixElements
表示; - 变量如果表示物体或者实体数量时,尽量使用
nXXXX
表示,e.g.nPoints
和nLines
代表点和线的数量,而不是points
; - 变量如果表示实体的编号时,尽量使用
xxxNo
表示,e.g.tableNo
或employeeNo
; - 变量赋值使用
<-
操作符,不要使用_
或者->
,可以使用=
;
2. 函数命名
- 函数命名要注意减少复杂度,e.g.
setTopic(topic)
而不是setTopic(value)
,getLength(line)
而不是getLineLength(line)
; - 如果函数返回值为布尔型,最好把
is
作为前缀,e.g.isSet()
、isVisible()
或isOpen()
而不是isFlag()
或whetherOpen()
,也可用has
can
should
代替is
;但不要用逻辑关系词not
,e.g.isNotOpen()
; - 如果函数需要一定时间遍历或者计算某个变量的值,最好使用
find
作为前缀,e.g.findNearestVertex(vertex)
或findMinElement(matrix)
;当不需要计算即可直接获得的可以使用get
作为前缀,e.g.getDictionary(Dictionary)
或getValue(value)
; - 如果函数用于初始化,则使用
initialize
作为前缀,e.g.initializeFontSet(printer)
而不是initFontSet(printer)
; - 如果某两个函数有相关性,尽量使用对称的动词作为前缀,减少命名复杂度,e.g.
getName(name)
v.s.setName(name)
,addStudent(student)
v.s.removeStudent(student)
,或create/destroy
,start/stop
,begin/end
或next/previous
; - 函数命名不要使用缩写,不要用
cmd
代替command
,或用cp
代替copy
等,e.g.computeAverage()
而不是compAvg()
;
3. 文件布局和程序语句
- 文件命名结尾以
.R
为后缀,不要使用.r
或者.s
; - 代码列数控制在80列以内,换行可以发生在逗号、操作符后;
-
循环控制变量
for()
中最好使用seq()
函数,如果变量\(x\)为空,则使用1:length(x)
或seq(length(x))
会造成错误的循环从1:0,e.g.:#推荐方式 for (kk in seq(along=x)){ : } #不推荐方式1 for (kk in 1:length(x)){ : } #不推荐方式2 for (kk in seq(length(x))){ : }
-
条件判断语句
if()
中尽量避免直接使用判断表达式,可以将结果赋值给变量, e.g.:#推荐方式 isFinished <- (elementNo < 0) || (elementNo > maxElement); isRepeatedEntry <- (elementNo == lastElement); if (isFinished || isRepeatedEntry){ : } #不推荐方式 if ((elementNo < 0) || (elementNo > maxElement) || (elementNo == lastElement)) { : }
-
条件判断语句尽量做好出现错误的提示,e.g.:
isError <readFile(fileName); if (!isError) { : } else { : }
- 每个操作符与变量间最好有一个空格,突出显示各操作符和变量,e.g.
sum <- (a + b) * 10.0
而不是sum<-(a+b)*10
;
4. 参考文献
[1] Henrik Bengtsson, R Coding Conventions (RCC): Version 0.9, Dept of Statistics, University of California, Berkeley, US, January 2009.
[2] R Development Core Team, R Language Definition, ISBN 3-901167-56-0.
[4] Java Programming Style Guidelines v3.0, Geotechnical Software Services.
[5] R Development Core Team, Writing R Extensions, ISBN 3-901167-54-4.
[6] Henrik Bengtsson, Safely creating S3 generic functions using setGenericS3(), Division for Mathematical Statistics, Centre for Mathematical Sciences, Lund University, Sweden, 2002.