R包的精华都在这个目录下
今天是生信星球陪你的第473天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
花花写于2019-10-21
这个10月不一般,考过了科三,办了护照,学会了剪视频、剪音乐,ppt又有了一些新收获,也写出了最简单版本的R包,还将于11月推出新的GEO数据库挖掘课程,就是这么紧锣密鼓。
言归正传,看一下前情回顾了:
《R包开发》这本书的第三章,讲的是R/这个目录,是关于R包所必须知道的最少知识,都是精华!
使用包的第一个原则是,所有的 R 代码都要放在 R/ 中。
1.R 代码的工作流程
-
(1) 编辑一个 R 文件。
-
(2) 按 Ctrl/Cmd+Shift+L(或运行 devtools::load_ all())。
-
(3) 在控制台中浏览代码。
-
(4) 修改代码,重复上面的过程。
❗️对于这个看起来灰常简单的流程,哈德雷蜀黍是这样说的:
即使你从本书中没有学到任何其他的东西,也已经了解了编辑和重新加载 R 代码的一个有用的工作流程。
2.组织函数
❌不要让每个函数占一个脚本。
❌不要把所有函数放进一个脚本。
❌永远不要使用只有大小写不同的文件名。
3.代码风格
-
谢益辉的 formatR 包可以一键清理代码。
formatR::tidy_dir("R")
-
Jim Hester 的 lintr 包检查代码是否符合风格指南,当它发现你忽略 了什么时会给出提示,有些提示是可以忽略的。
lintr::lint_package()
(1)函数名
下划线分割,避免使用现有的变量名和函数名。
(2)空格
除了冒号外的运算符号前后使用空格;
逗号后面加空格;
左括号前使用空格,但在函数调用中除外
(3)花括号
右花括号单独占一行,除非后面跟 else
(4)行代码长度
每行代码限定在 80 个字符内
(5)缩进
使用两个空格缩进,不要使用 Tab 或混用 Tab 和空格。
(6)赋值
在赋值表达式中使用 <-
, 不用=
(7)注释
注释以井号开头,解释为什么,而非是什么。使用 – 和 = 把文件分割成容易阅读的代码块。
4.顶层代码
(1)加载代码
用source加载脚本中的函数,代码会立即执行,且结果立即可用;
而R包中的函数,则是编译时运行, 加载(library)后结果才可用。
因此:
包的代码只能创建对象,主要是函数
(2)R 运行环境
永远不要用一些修改全局设置的函数。
-
不要用 library() require(),而是用 DESCRIPTION 来指定包的依赖包。
-
不要使用 source() 从文件加载代码。
source() 将代码执行的结果添加到当前环境,因此会修改当前环境。可以使用devtools::load_all()
,它会自动 source R/ 目录下所有的文件. -
如果你修改全局的 options() 或图形的 par(),先把旧的设置保存下来,然后在你用完 之后恢复到原来的值:
old <- options(stringsAsFactors = FALSE)
on.exit(options(old), add = TRUE)
-
需要作图和输出结果到控制台时,把输出功能做成独立的函数。
-
避免依赖用户的运行环境。
(3)何时需要副作用
(副作用这个词听起来有点别扭,可是我查了,这个翻译是对的。)
使用.onLoad()
函数,其常见用法有:
-
在包加载时显示一些信息,也就是说library出现的提示信息就是从这里来的!
-
用 options() 来为你的包设置自定义选项。
在devtools里面,是这样写的:
.onLoad <- function(libname, pkgname) {
op <- options()
op.devtools <- list(
devtools.path = "~/R-dev",
devtools.install.args = "",
devtools.name = "Your name goes here",
devtools.desc.author = 'person("First", "Last",
"first.last@example.com", role = c("aut", "cre"))'
devtools.desc.license = "What license is it under?",
devtools.desc.suggests = NULL,
devtools.desc = list()
)
toset <- !(names(op.devtools) %in% names(op))
if(any(toset)) options(op.devtools[toset])
invisible()
}
-
把 R 连接到另一种编程语言。
(太难不看系列) -
使用 tools::vignetteEngine(),注册一个使用指南生成引擎。
如果用了 .onLoad(),记得用 .onUnload() 来清理副作用。
(4)S4 类、泛型和方法
(太难不看)
5.CRAN 注记
提交到CRAN的要求:
只能使用 ASCII 字符.
Unicode 字符需要转义转义:stringi::stri_escape_unicode()
x <- "This is a bullet •"
y <- "This is a bullet u2022"
identical(x, y)
#> [1] TRUE
cat(stringi::stri_escape_unicode(x))
#> This is a bullet u2022
洲更写的R包binmarp今天被CRAN收录了,于是我就有了新的小目标。
这种感觉就像你正在爬山不知道正确的方向在哪,刚好半山腰有个好心人朝你闪了一下手电筒,那叫一个干劲十足~
等我写的包也被收录的时候,我就回来数一下距离今天过去了多久。
插我们公众号唯一一个小广告!
再给生信技能树打个call!
全国巡讲第19-20站(福州和上海线下培训)
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!