软件配置
本章主要是代码标准与技术的内容,需要安装的包是lubridate和dplyr,这些包用来演示良好的实践。高效协作的5条高级技巧:
-
保持统一的编码风格 -
仔细思考你的注释并随时更新 -
尽可能使用版本控制 -
信息化提交消息 -
不要害怕来自同事的反馈
编码风格
编码风格要前后一致,没有唯一,几个多数程序员都赞成的风格:
-
模块化代码 -
注释你的代码 -
不要重复自己的代码 -
代码简洁、清晰、一致 比如在R语言里用<- 代替=,符合自动化原则,改善代码最简单的是,使用Rstudio自动完成代码改善。
使用Rstudio风格化代码
Rstudio可自动清理不标准缩进和格式化代码,选中要格式化的代码,“”Ctrl-I“自动缩进。Ctrl-Shfit-A将格式化代码,添加空格以保证最大可读性,发现在code菜单下也能找到相应选项。
# 原代码
for (a in 1:9) {
print(a*2)}
# Ctrl-I
for (a in 1:9) {
print(a*2)}
# Ctrl-Shfit-A
for (a in 1:9) {
print(a * 2)
}
文件名
代码后缀R,文件名小写,避免空格,使用破折号或者下划线分割单词。
加载包
开始出加载,加载必要包时,使用library,而不是require,因为缺包时library会报错,包名应该用引号包起来。
注释
太多注释降低效率,确保注释有具体含义,避免无意义注释。注释应该提供语境,以#开头,后面加一个空格,Rstudio中使用Ctr-Shift-C注释或取消注释。如果注释使用#—-,它可以折叠两个这种注释之间的代码。
对象名
为你的对象使用含义清晰、前后一致的名字,会大幅提高项目的效率。如果一个对象只使用一次,那无所谓啦。建议使用get_result这样的形式,避免使用.,防止Python程序员受到迷惑。函数中,必选参数放第一位,紧接着可选,特殊的…放最后,如果对应布尔型参数,为了清晰应该使用TRUE/FALSE,因为虽然T/F是缩写也可以使用,但可能被重新赋值,引起错误。尽量避免以来别的参数的参数,会使非常难以理解。典型情况是设置变量的缺省值NULL,并使用is.null()检查它的值,而不是使用missing(),只要可能,避免使用已有函数的名字。
样例包
lubridate是一个很好的样例,拥有一致的命名系统,便于用户猜测其特性和行为。
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#>
#> date, intersect, setdiff, union
ymd("20110604")
#> [1] "2011-06-04"
mdy("06-04-2011")
#> [1] "2011-06-04"
dmy("04/06/2011")
#> [1] "2011-06-04"
赋值
“<-”和“=”都可以,多数R用户一般应“<-",因为函数调用时二者有区别。
system.time(time=1000)
# Error in system.time(time = 1000) : 参数没有用(time = 1000)
system.time(time<-100000)
用户 系统 流逝
0.00 0.01 0.02
空格
一致的空格风格容易增强你的代码可读性,应该在+-以及*的周围添加空格,包括赋值符号”<-",可以帮助避免bug。Ps.关于bug的来历,据说是这样的,第一台计算机ENIAC的连接线路经常被虫子咬断,于是就有了找虫子之说。
缩进
使用两个空格缩进代码,不要混合使用tab和空格,Rstudio自动转换Tab为空格,Tools-Global options-Code
大括号
大括号的开口{,不应该另起一行,随后紧跟分行符,这样会报错。大括号的封闭部分}应该独立成行}(除非紧跟else,else紧跟其后),大括号的代码应该缩进(Rstudio执行该规则的)。
x = 4
y <- 6
if (x>5) {
x
} else{
y
}
版本控制
可以备份你的代码,版本控制系统永远备份你的代码。这里作者推荐使用git。
安装git
# deb系系统
sudo apt install git # 当然windows/mac也可以使用github desktop解决
## 提交 保持提交原子化,每次提交只做一件事,并附上清晰的说明,这仅更新本地文件分支,如果想更新远程的,需要git push命令。或者右侧选项卡,同样可以操作(下图),前提是你建立项目时打开了版本控制选项,或者tools-Vsersion Control–Project Setup,中选择git。
Github
当然,大家都知道这是全世界最大的同性交友平台,开个玩笑。国内由于众知的原因,访问速度已经接近于 当年的拔号上网时代,好在有许多方法可以加速,比如镜像/导入到国内的gitee,或者用这个我在用的软件https://github.com/docmirror/dev-sidecar。
devtools::install_github() #这个命令可以轻松安装github上的包,但是不能update
分支、分叉、更新、克隆
git是一个需要花费长时间学习的大型程序,掌握其高级功能的基础可使你成为一个较高效的协作者。分支是存储不同的版本,git允许你在项目的不同版本之间跳转。git checkout -b test #相当于创建一个分支并转入
分叉类似分支,但存放在别人机器上,通过git clone可以将该分叉克隆到本地,更易于协作。pull request是Github的一种机制,可以添加你的代码到已有项目中,PR为别人提供了在合并之前逐行注释代码的机会。
代码审查
考虑以下几个问题:
-
1、代码正确吗?具有合理的文档? -
2、能否再改善 -
3、代码是否符合已有编程风格 -
4、有自动测试吗?是否充分?注意事项: -
1、反馈要建设性的,除了指出错误,还要有改善建议;无误时赞扬 -
2、审查代码设定时间表或审核行数 -
3、 应该在代码合并前完成,尽快改错 StackOverflow是一个交流的好去处。
第十章 高效学习
软件配置
swirl包
install.packages("swirl")
library(swirl)
# | Hi! I see that you have some variables saved in your workspace. To keep
| things running smoothly, I recommend you clean up before starting swirl.
| Type ls() to see a list of the variables in your workspace. Then, type
| rm(list=ls()) to clear your workspace.
| Type swirl() when you are ready to begin.
Warning message:
程辑包‘swirl’是用R版本4.0.5 来建造的
高效学习的5个高级技巧
1、使用R内部帮助
针对主题探索R
help.search("optim")# 或者??optim
# 更加精确些
help.search(pattern = "optimistation|optimiz",
fields = c("title", "concept"), package = 'stats')
# 另一个是apropos()
apropos("optim")#给出结果较少
# [1] "constrOptim" "optim" "optimHess" "optimise" "optimize"
apropos("lm")
[1] ".colMeans" ".lm.fit" "colMeans" "confint.lm"
[5] "contr.helmert" "dummy.coef.lm" "glm" "glm.control"
[9] "glm.fit" "KalmanForecast" "KalmanLike" "KalmanRun"
[13] "KalmanSmooth" "kappa.lm" "lm" "lm.fit"
[17] "lm.influence" "lm.wfit" "model.matrix.lm" "nlm"
[21] "nlminb" "predict.glm" "predict.lm" "residuals.glm"
[25] "residuals.lm" "summary.glm" "summary.lm"
查找和使用简介
包简介是理解函数的最好方式,是详细文档的片段,一般高质量,用于演示实例,在宽泛解释下提供更长的例子。如果某包缺少简介,可以尝试自己编写一个。
# 创建简介
# 首先下载源码
devtools::use_vignette() # 没找到这个函数呢?根据小洁的博文,应该是过时了
附上替代参考:写R包的长篇使用文档vignette – 简书 (jianshu.com)
# 浏览某包简介,浏览器自动打开网页,和vignette(package = "benchmarkme")类似,后者只打开一个窗口,提示有简介
browseVignettes(package = "benchmarkme")
# 不加包名,就展示所有的,好多呀
browseVignettes()
vignette("introduction",package = "ggplot2") # 比较怪,没反应,可能也过时了
获取函数帮助
# 这个大家应该很熟悉了,帮助页面描述功能,而不是如何工作,因此觉得难懂
help("optim")
?optim
# ...之前是必要参数,之后是可选参数,
Usage
optim(par, fn, gr = NULL, ...,
method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
"Brent"),
lower = -Inf, upper = Inf,
control = list(), hessian = FALSE)
optimHess(par, fn, gr = NULL, ..., control = list())
example(optim) #会收获三张图和一个代码例子呢
例子位于帮助底部
阅读源码
Rstudio,单击某函数,按F2,即会打开源代码(有的笔记本可能要按Fn+F2) 比如这个rowname()的
function (x, do.NULL = TRUE, prefix = "row")
{
dn <- dimnames(x)
if (!is.null(dn[[1L]]))
dn[[1L]]
else {
nr <- NROW(x)
if (do.NULL)
NULL
else if (nr > 0L)
paste0(prefix, seq_len(nr))
else character()
}
}
swirl
R交互式教学平台,是R的帮助大全
library(swirl)
| Hi! I see that you have some variables saved in your workspace. To keep things running smoothly, I
| recommend you clean up before starting swirl.
| Type ls() to see a list of the variables in your workspace. Then, type rm(list=ls()) to clear your
| workspace.
| Type swirl() when you are ready to begin.
> swirl()
| Welcome to swirl! Please sign in. If you've been here before, use the same name as you did then. If
| you are new, call yourself something unique.
What shall I call you?
感觉像古老的dos游戏最低级版本,自由探索吧。
在线资源
-
R社区、官方手册、读现有出版物最新进展、邮件列表等等 -
遇到困难寻求帮助 Stack Overflow网站提出问题要有最小数据集、最小案例 -
实战演示R书籍和教程,深入学习最有效 Rstudio 和DataCamp提供的免费在线课程,《R数据科学》、《R programming for Data Science》、《Advanced R Programming》 -巩固学习(写出并传授),也就是传播知识 docendodiscimus
本篇文章来源于微信公众号: 微因