《高效R语言编程》9、10–高效协作和学习

软件配置

本章主要是代码标准与技术的内容,需要安装的包是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


本篇文章来源于微信公众号: 微因

发表评论