气宇轩分享 http://blog.sciencenet.cn/u/yufree

博文

Google R 编码指南

已有 5158 次阅读 2013-3-16 18:24 |个人分类:翻译|系统分类:科研笔记| google, medium, 指南, 艺术创作

萝卜青菜 各有所爱 
我受够了自己乱七八糟的R编码方式 所以翻译了Google的一个指南 
你可以不同意Google定下的R编码风格 但一定要有一个自己持之以恒并且条理清晰的编码风格 
写代码也是一种艺术创作 你很难用凌乱的代码表达清晰的思路 也很难用清晰的代码表达凌乱的思路
形式不决定内容 但好内容必有好形式

源文件 http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html

1 命名法与表示

文件名文件名以.R为结尾 有意义 
GOOD: predict_ad_revenue.R 
BAD: foo.R

标识符

不要使用_或者-分隔符 变量名用小写字母 单词用.分割 函数名用驼峰法命名无分隔符 常数命名类似函数但前面加k

variable.name 
GOOD: avg.clicks 
BAD: avg_Clicks , avgClicksFunctionName 
GOOD: CalculateAvgClicks 
BAD: calculate_avg_clicks , calculateAvgClicks 
Make function names verbs. 
kConstantName

2 语法

行距

最大行距80个字符

缩进

代码要缩进两个空格 不要用制表符( tab ) 也不要制表符与空格混着用 括号中行对齐以括号中的一个字符为准

空格

二元操作符 ( + ,  = ,  - , <- ,  etc. ) 前后都要有空格
当函数中传递参数时 = 周围的空格要根据实际情况来
, 前面不要有空格 但之后要有空格

GOOD:
tabPrior <- table(df[df$daysFromOpt < 0, "campaignid"])
total <- sum(x[, 1])
total <- sum(x[1, ])
BAD:
tabPrior <- table(df[df$daysFromOpt<0, "campaignid"]) # Needs spaces around '<'
tabPrior <- table(df[df$daysFromOpt < 0,"campaignid"]) # Needs a space after the comma
tabPrior<- table(df[df$daysFromOpt < 0, "campaignid"]) # Needs a space before <-
tabPrior<-table(df[df$daysFromOpt < 0, "campaignid"]) # 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)

如果有助于对齐可以使用多个空格
plot(x = xCoord,
y = dataMat[, makeColName(metric, ptiles[1], "roiOpt")],
ylim = ylim,
xlab = "dates",
ylab = metric,
main = (paste(metric, " for 3 samples ", sep="")))

不要在括号或者方括号中代码前后加空格

GOOD:
if (debug)
x[1, ]
BAD:
if ( debug ) # No spaces around debug
x[1,] # Needs a space after the comma

花括号

左花括号在代码后 右花括号要单独占一行 
可以省略单句表达式的花括号 但一旦确定后面的代码都要遵守同一规则
在新的一行里写代码主体

GOOD:
if (is.null(ylim)) {
ylim <- c(0, 0.06)
}

xor (but not both)
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)}

赋值

使用 <- 而不是 = 来赋值

GOOD: x <- 5
BAD: x = 5

分号

不要用分号终止行或同一行写多条命令

3 组织

总体布局与排序

如果每个人用同样的排序 理解其他人的脚本会更方便
1 版权声明
2 作者注释
3 文件描述 包括目的 输入值 输出值
4 source() 与 library() 的依赖与需求声明
5 函数定义
6 执行语句 如果可用 (e.g. ,print plot)
单位测试用另外的文件如originalfilename_unittest.R表示

注释指南

一定要注释代码
用井号加空格表示注释
简短注释要在代码后加两个空格之后加井号 之后加一个空格

# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pctSpent,
breaks = "scott", # method for choosing number of buckets
main = "Histogram: fraction budget spent by campaignid",
xlab = "Fraction of budget spent",
ylab = "Frequency (count of campaignids)")

函数定义与调用

函数定义要先列举没有默认值的参数名 之后是有默认值的函数定义与调用中允许多个参数 但只允许参数间断行

GOOD:
Predict
CTR <- function(query, property, numDays,
showPlot = TRUE)

BAD:
Predict CTR <- function(query, property, numDays, showPlot =
TRUE)
理想状态下 单元测试作为样本函数测试

函数文档

函数应当在函数定义行下包含注释行 注释包括一句简单函数描述 函数参数列表与解释 对返回值的描述 注释要简单明了方便调用者在不读代码的状态下调用

函数举例

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 invalid 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)
}

待办模版

在代码中使用统一的模版

TODO(username): Explicit description of action to be taken

4 语言

attach 避免使用
函数 避免使用stop()
对象与方法 避免S4对象与方法 不要用混了S3与S4对象与方法

5 免责条款

上面所说的代码转换要遵守 除非有更好的选择
免责条款要包括法律条文与第三方修改

6 结语

符合常识 前后一致
如果你编辑代码 参考周围的代码并决定模版 原作者怎么用你也那样用
模版指南用来说明你想说的而不是你怎样说的 我们指定了全局模版但个人模版也很重要 如果你在作者的代码中添加了一段自己模版的代码会导致其他人在阅读时不爽 不要这么做 
关于写作说的够多了 编程本身很有趣 试着享受这种乐趣

7 参考文献

http://www.maths.lth.se/help/R/RCC/ - R Coding Conventions 
http://ess.r-project.org/ - For emacs users. This runs R in your emacs and has an emacs mode.
===
update 1
没想到科学网的编辑器如此难用 直接从evernote里copy带格式的文本反而乱码一片 
今后只用纯文本!
update 2
败了 纯文本都被识别成公式了 这编辑器恶心人到一定境界了 就没个代码引用啊
科学网你是打算给科研人员用的吗?这样的网页设计水准完全中学生水平啊
update 3
我总算看明白了 这垃圾编辑器默认支持latex 方便写公式 $是个钩子 
既然都支持公式了为什么不加个代码引用呢 再者既然支持latex干脆加上verbatim包呗 


https://blog.sciencenet.cn/blog-430956-670868.html

上一篇:谣言动力学
下一篇:最小一乘法的解为什么是中位数?
收藏 IP: 159.226.240.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-26 15:31

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部