《高效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") # 比较怪,没反应,可能也过时了

vignette只提示有简介,无跳转

不加包

获取函数帮助

# 这个大家应该很熟悉了,帮助页面描述功能,而不是如何工作,因此觉得难懂
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 第 3.8 章 优秀 workflow 推荐 Workflow 中文的意思是工作流,它表示把多个事件联合在一起,形...
    奶茶大叔阅读 1,419评论 0 1
  • Golang作为一门新的编程语言,它借鉴了现有语言的思想但拥有着不同寻常的特性,使得有效的Go程序在性质上不同于其...
    云时代的运维开发阅读 891评论 0 0
  • 最近在学习R,主要在看《R语言入门与实践》这本书(Garrett Grolemund著,冯凌秉译,人民邮电出版社)...
    韦子谦阅读 1,709评论 0 5
  • 学习一门语言,首先要了解该语言的代码编程规范,以提高代码的可读性、规范性。 一、 命名规范 同其他编程语言一样,g...
    Every_dawn阅读 720评论 0 2
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,714评论 2 7