R语言观察日志(part16)--Google‘s R Style Guide
学习笔记,仅供参考
自翻,有错必究
文章目录
- Google's R Style Guide
- summary
- R语言风格
- R语言规则
- 符号和命名
- 文件名
- 标识符
- 每行长度(注意)
- 缩进
- 空格
- 花括号
- 被大括号括起来
- 赋值
- 分号
- 总体布局和排序
- 注释
- 函数定义和调用
- 功能文档
- 例子函数
- TODO Style(to do 要做, 但是没有完成的事)
- 附加
- 功能
- 对象和方法
- 特别的
- 临别赠言
- 参考文献
Google’s R Style Guide
R是一种高级编程语言,主要用于统计计算和图形,R编程风格指南的目标是使我们的R代码更容易阅读、共享和验证,以下规则是与谷歌的整个R用户社区合作设计的。
summary
R语言风格
条目 | 风格 |
---|---|
文件名 |
以.R 结尾
|
标识符 |
variable.name (或variableName),FunctionName,kConstantName
|
每行长度 | 最多80个字符 |
缩进 | 两个空格,没有制表符 |
空格 | |
花括号 | 左花括号在同一行,右花括号自占一行 |
else | 用括号将else括起来 |
赋值 |
使用 <- ,而不是 =
|
分号 | 不要使用它们 |
总体布局和排序 | |
注释 |
所有注释以# 开头,后跟空格;# 之前的内嵌注释需要两个空格
|
函数定义和调用 | |
功能文档 | |
示例函数 | |
任何风格 |
TODO(username)
|
R语言规则
条目 | 规则 |
---|---|
附加(Attach) |
避免使用it
|
函数 |
应该使用stop() 引发错误
|
对象和方法 | 尽可能避免S4对象和方法;永远不要混淆S3和S4 |
符号和命名
文件名
文件名必须有意义,且以.R
结尾。
good例子:predict_ad_revenue.R
bad例子:foo.R
标识符
标识符中不要使用下划线(_
)或连字符(-
),标识符应根据以下约定命名:
- 变量名的首选形式是所有小写字母和用点分隔的单词(
variable.name
),但variableName
也是可以接受的; - 函数名以大写字母开头,没有点(
FunctionName
); - 常数的命名类似于函数,但以
k
开头。
variable.name
是首选,variableName
也是可以接受的:
good例子:avg.clicks
ok例子:avgClicks
bad例子:avg_Clicks
FunctionName
:
good例子:CalculateAvgClicks
bad例子:calculate_avg_clicks
,calculateAvgClicks
使函数名成为动词。
特别的:当创建一个classed object时,函数名(构造函数)和类应该匹配(例如,lm
)
每行长度(注意)
每行最大字符数为80个字符。
缩进
缩进代码时,请使用两个空格。
切勿使用制表符或制表符和空格的混合。
特别的:当括号内出现换行符时,将换行与括号内的第一个字符对齐。
空格
在所有二元运算(=, +, -, <-
等)符周围放置空格
特别的:在函数调用中传递参数时,=
周围的空格是可选的。
不要在逗号前加空格,但一定要在逗号后加空格。
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"])
# < 周围需要空格
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])
# 逗号后面需要空格,而不是前面
在左括号前加一个空格,函数调用除外。
good例子:if (debug)
bad例子:if(debug)
如果存在额外的空格(即一行中有多个空格)可以增加等号或箭头(<-)的对齐效果,那也没关系:
plot(x = x.coord,y = data.mat[, 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 ) # debug周围应该没有空格
x[1,] # 逗号后需要一个空格
花括号
左花括号不应该单独成一行,右花括号应该总是单独成一行;
当一个块由一条语句组成时,可以省略花括号;
但是,对于单个语句块,必须始终使用或不使用花括号。
good例子:
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
语句应该总是在同一行用花括号括起来。
good例子:
if (condition) {one or more lines
} else {one or more lines
}
bad例子:
if (condition) {one or more lines
}
else {one or more lines
}
bad例子:
if (condition)one line
elseone line
赋值
使用 <-
,而不是 =
进行赋值。
good例子:x <- 5
bad例子:x = 5
分号
不要用分号结束您的行,也不要用分号将多个命令放在同一行。(分号不是必须的,为了与其他Google样式指南保持一致,省略分号。)
总体布局和排序
如果每个人都使用相同的顺序,我们将能够更快、更容易地阅读和理解彼此的脚本。
词序 | 内容 |
---|---|
1 | 版权声明注释 |
2 | 作者的话 |
3 | 文件描述注释,包括程序的目的、输入和输出 |
4 |
source() 和library() 语句
|
5 | 定义功能 |
6 | 已执行的语句(如打印、绘图) |
单元测试应该放在一个单独的名为originalfilename_test.R
的文件中
注释
注释你的代码,整个注释行应以#
和一个空格开始。
短注释可以放在代码后面,前面有两个空格,#
,然后是一个空格。
good例子:
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,breaks = "scott", # method for choosing number of bucketsmain = "Histogram: fraction budget spent by campaignid",xlab = "Fraction of budget spent",ylab = "Frequency (count of campaignids)")
函数定义和调用
函数定义应该首先列出不带默认值的参数,然后列出带默认值的参数;
在函数定义和函数调用中,每行允许多个参数;
只允许在赋值(assignments)之间换行(读不懂就看下面的例子)。
good例子:
PredictCTR <- function(query, property, num.days,show.plot = TRUE)
bad例子:
PredictCTR <- function(query, property, num.days, show.plot =TRUE)
理想情况下,单元测试应该作为示例函数调用(用于shared library routines)。
功能文档
函数应该在函数定义行的正下方包含一个注释部分;
这些注释应该包含对功能的一句话描述;
函数参数的列表,用Args:
表示,并对每个参数进行描述(包括数据类型);
返回值的描述,用Returns:
表示。
注释应该具有足够的描述性,以便调用方可以使用该函数,而无需阅读函数的任何代码。
例子函数
good例子:
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 handlingif (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)
}
TODO Style(to do 要做, 但是没有完成的事)
在你的代码中使用一致的todo风格。
good例子:
TODO(username): Explicit description of action to be taken
附加
使用attach
时产生错误的可能性很大,请避免它。
功能
应该使用stop()
抛出错误(Errors)。
对象和方法
S语言有两个对象系统,S3和S4,这两个系统都可以在r中使用。S3方法更具交互性和灵活性,而S4方法则更加正式和严格。
使用S3对象和方法,除非有充分的理由使用S4对象或方法。
使用S4对象的充分理由是:
- S4对象可以直接在c++代码中使用对象;(an S4 object would be to use objects directly in C++ code)
- S4泛型/方法将在两个参数上进行分派。(an S4 generic/method would be to dispatch on two arguments.)
避免混合S3和S4: S4方法忽略S3继承,反之亦然。(Avoid mixing S3 and S4: S4 methods ignore S3 inheritance and vice-versa)
特别的
应该遵循上面描述的编码约定,除非有充分的理由不这样做。例外情况包括遗留代码和修改第三方代码。
临别赠言
运用常识,保持一致。
如果您正在编辑代码,请花几分钟时间查看您周围的代码并确定其风格。
如果别人在if
子句周围使用空格,你也应该这样做。如果他们的评论周围有星星的小框,那么让你的评论周围也有星星的小框。
制定风格指南的要点是要有一个通用的编码词汇表,这样人们就可以专注于你所说的内容,而不是你是如何说的。
我们在这里提供全局样式规则,以便人们了解编码词汇表。但地方风格也很重要。如果添加到文件中的代码看起来与周围现有的代码有很大的不同,不连续会让读者在阅读时失去节奏。尽量避免这种情况。
关于写代码的内容讲得够多了,代码本身要有趣得多。玩得开心!
参考文献
R编码约定:ht#tps://#pa#n.ba#id#u.com/s#/16McHYOBI_P-dqOrB7VosUg
emacs用户,它在emacs中运行,并具有emacs模式:
R语言观察日志(part16)--Google‘s R Style Guide相关推荐
- R语言观察日志(part20)--包的组件之R代码
学习笔记,仅供参考,有错必纠 文章目录 R代码 R代码的工作流程 组织函数 代码风格 对象名称 空格 余下的请看R语言观察日志(part16)--Google's R Style Guide 顶层代码 ...
- R语言观察日志(part23)--bibliometrix包
R语言文献计量分析笔记 参考文献:如何用 R 快速了解科研领域?; BiblioShiny使用介绍; R语言快速实现文献计量分析 GitHub:https://github.com/massimoar ...
- R语言观察日志(part15)--R的缺点
学习笔记,仅供参考,有错必纠 摘自:基于R语言的机器学习 R的缺点
- R语言观察日志(part4)--paste函数
学习笔记 转载自:R语言中字符串的拼接操作 paste函数 在R语言中 paste 是一个很有用的字符串处理函数,可以连接不同类型的变量及常量.函数paste的一般使用格式为: paste(..., ...
- R语言观察日志(part18)--.C和.Call
学习笔记,仅供参考,有错必纠 文章目录 .C(外来函数接口) 描述 用法 参数 细节 返回值 参数类型 注意 .Call(C/C++代码的接口) 描述 用法 参数 细节 返回值 .C(外来函数接口) ...
- R语言观察日志(part8)-RMarkdown之其他语言
学习笔记,仅供参考,有错必纠 参考自:官方文档rmarkdown;R Markdown中配置python R Markdwon 其他语言 我们的.Rmd文件同样可以执行除了R以外的语言,比如: Pyt ...
- R语言观察日志(part17)--.Primitive
学习笔记,仅供参考,有错必纠 文章目录 .Primitive 描述 用法 参数 细节 例子 .Internal 描述 用法 参数 .Primitive 描述 .Primitive通过名字查找一个内部实 ...
- R语言观察日志(part14)--R语言杂记
学习笔记,有错必纠 文章目录 2020年8月杂记 search函数 未命名 向量化计算 ls函数 2020年8月杂记 search函数 search函数可以查看当前环境已加载的R包: R>sea ...
- R语言观察日志(part13)--从GitHub中下载R包
学习笔记,仅供参考,有错必纠 从GitHub中下载R包 这里,我们将介绍两种下载并加载R包的方式,即通过在线安装和本地安装. 在线安装 我们在使用在线安装的方法时,可能会遇到各种各样的问题,这里,我们 ...
最新文章
- 突然就懵了!面试官问我:线程池中多余的线程是如何回收的?
- HashMap和Hashtable及HashSet的区别
- 《R语言实战》第4章
- Charles学习(三)之使用Map local代理本地静态资源以及配置网页代理在Mac模拟器调试iOS客户端...
- 从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练
- HTML常用标签+CSS基础
- 微软发布 VS Code Jupyter 插件!不止 Python,多语言的 Jupyter Notebook支持来了!
- [Python3] 面向对象编程
- java 性能优化分析工具_【java】JVM性能调优监控工具、可视化在线内存分析工具...
- 数字图像处理:图像直方图基础知识介绍
- 去百度还是去创新工厂? 信开复还是信彦宏?
- python获取远程主机信息_python远程获取主机监控信息
- python 循环写入excel_用PYTHON将“for”循环的输出写到excel中
- 阿里王坚:人工智能是一个非常傲慢的提法,这个提法最后会害死大家
- Sprig的EL表达式和读取Properties文件教程
- UI电话图标设计教程
- android xml绘图p113-p117
- Oracle项目管理主数据之OBS
- sequelize的使用
- java 简单背包问题_简单的背包问题--java递归实现