提交自己开发的R包到CRAN或Bioconductor


做生信的最终梦想,就是自己开发一款热度极高的R包,在历史上留下一笔。

之前的开发经验非常重要:https://github.com/leezx/Toolsets

Bioconductor Packages: Development, Maintenance, and Peer Review - 总教程

Building packages for Bioconductor by Rstudio - 创建空的R包模板

All Packages - 查询目前所有的single cell的R包

1. 取个R包名,这个后面就不要改了;

2. 用Rstudio来创建和管理R包;

3. 链接到GitHub备份【推荐GitHub desktop】;

参考Seurat包的布局:https://github.com/satijalab/seurat

R里面的独立脚本

  • data.R
  • visualization.R
  • bifurcated_clustering.R
  • differential_expression.R

加入新的功能文件夹

  • data
  • inst
  • vignettes

4. 在本地测试开发R代码,函数名、变量名取好一点,然后就可以导入到包的R文件夹里了;

这是最主要的步骤,需要耐心设计,基本包含了包的全部功能。

  • 最开始,随便哪一个开发数据集,在jupyter里以数据分析的形式开始开发,能分析出自己满意的结果未知;
  • 然后,模块化,按核心功能,把代码封装成函数,设置好参数和输出结果;
  • 接着,重命名关键变量和函数,将函数导入到R package里开始以source的方式调试;
  • 然后,在函数上面写doc,这个比较简单;
  • 最后,在GitHub发布R包,安装后,最少用5种不同的数据集测试代码,发现bug,然后debug,循环几次就差不多了。

函数命名法则

  • 驼峰命名法,首字母大写,单词间不要间隔,以后每个单词首字母大写
  • “.”用于结尾,表示多态性
  • 名字不太太长,否则很丑,名字多是动词短语或名词
  • 用sublime批量修改比较方便 

变量命名 

  • 变量统一小写
  • 变量用"."分割

包的设置

DESCRIPTION文件

主要是import package、author的格式

参考:https://github.com/satijalab/seurat/blob/master/DESCRIPTION

gitdoc自动生成文档

每次运行之前记得备份namespace文件,会自动覆盖。

Rscript -e "devtools::document()" && cd .. && R CMD Rd2pdf iterbi && mv iterbi.pdf iterbi && cd iterbi

测试【check之前必须移除无关的文件,比如pdf,教程文档等】

Rscript -e "devtools::document();devtools::check();devtools::build()"

其实写个包还是挺难的,有太多注意事项了。

  1. 写一个函数,初步完成指定功能,明确输入输出;
  2. 函数名、变量名,API的泛化、debug;
  3. 撰写文档,一个参数都不能少;
  4. 确定依赖包,需要在description和namespace里说明;
  5. 通过check【check一下都要接近10分钟】;

很多事情都要不断的打磨:

  • 泛化,随着测试数据集的变化,总有不同的condition,就需要不断的泛化
  • 命名,根据对分析理解的加深,会有新的命名方法 

删掉所有注释再提交到GitHub 

设计原则

如何提交到Bioconductor?

Package Submission

文章发表 

如果真想做一个好包,那就把开发的逻辑梳理清楚,然后投稿,差不多接收了就可以把包提交到bioconductor。

一些报错

Error in get(genname, envir = envir) : object 'testthat_print' not found

rlang is a collection of frameworks and APIs for programming with R.

Update testthat to 3.0.0 or newer.

install.packages("rlang", dependencies = c("Depends", "Imports", "LinkingTo", "Suggests"))

Dependence on R version ‘3.6.2’ not with patchlevel 0

CRAN check warning: Dependence on R version '3.4.3' not with patchlevel 0 【不要到补丁号】
roxygen2 generate namespace【自动生产新定义的函数,在namespace文件里自动export一下】
Namespace dependencies not required 【所有在namespace里import的都要在description里import】
Error: object ‘str_wrap’ is not exported by 'namespace:ggplot2' 【搞错了】
Undefined global functions or variables 【dataframe等的列名,需要加入global】

【description里面一个要句号,一个不能有句号,要求很严格】

Malformed Title field: should not end in a period.
Malformed Description field: should contain one or more complete sentences.

参考:

  • R包开发第一课之流程速览