提交自己开发的R包到CRAN或Bioconductor
2023年02月09日
Note:要在包里加入新的data,就必须同名,在R里的名字要和文件名一模一样,否则会报错。(Error: 'mouse.house.keeping.gene' is not an exported object from 'namespace:bt2m')
2023年01月17日
namespace文件里的标点符号要特别注意,逗号句号。
主函数里面的函数头描述非常重要,不要重复。
一旦框架搭起来了,后面开发就简单了。
在notebook里做分析,可视化,然后把代码打包起来,有一个基本的函数就可以了;
函数的调试有点复杂,那么可以直接去壳运行(API赋值),直接查看每一步的结果是否符合预期,不符合就不断debug调试;
复杂一点的函数非常有必要画一个算法流程图,明确每一步都是在干啥;
Rscript -e "devtools::document()" && cd .. && R CMD Rd2pdf bt2m && mv bt2m.pdf bt2m && cd bt2m
上面的命令第一步就是检车包、生成文档,第二步就是生成pdf。
Rscript -e "devtools::document();devtools::check();devtools::build()"
这个才是完成的编译包的命令。
需要clean包里的内容
- notebook
- bt2m.pdf
check之后必须解决所有warnings才能build。
常见有如下几种warnings
Namespaces in Imports field not imported from:
This message appears when you include a package in the Imports: field in DESCRIPTION file and no function in this namespace is called by any function of the package. In this case, it means that in the R code of the package there was no call like tydir::fun, where fun represents any function of that package.
To solve it, simply delete the reference to the package in Imports: field within DESCRIPTION file. This was fixed in this commit for the package involved in the question: clustRcompaR.
Undocumented arguments in documentation object
去修改指定函数的document就行
Files not of a type allowed in a ‘data’ directory:
删掉无关文件
Note: significantly better compression could be obtained
压缩rda
2023年01月11日
整体流程就是:
1. 从空包开始,添加函数、数据,确保包能被devtools正常编译安装;
2. 自动构建document,生成GitHub page;
3. 不断调试优化,添加新功能;
在DFCI二次启动,又有了一些新的想法,iterbi换个马甲,bt2m这个名字更加经典。
重新配置基本的开发环境,R studio和R,Mac上就不要用conda了,因为搞不了什么大数据分析,容易紊乱。【不要让两个R kernel共享一个libPath,会corrupt】
直接用conda里的R的开发环境,不要用Rstudio,除非万不得已。
基本的devtools,生成PDF时需要用MacTeX,在Mac上安装一下。【那Linux就没法生成了?】需要一些依赖包。
# for Rscript build install.packages(c("fs", "cli", "rlang", "magrittr", "mime", "glue", "purrr", "roxygen2"))
要看懂报错,是mac缺了一个latex工具,brew装一个basictex即可,Where do I get the pdflatex program for Mac?
报错后继续寻找解决方案:inconsolata missing to build R vignette
install.packages("knitr") library(knitr) install.packages("tinytex") tinytex::install_tinytex()
走了很多弯路,最后这个解决了,字体的原因。【不要用MacPort,Mac就用Brew】
# LaTeX tools like pdflatex brew cask install basictex # Install texlive packages needed to build R package vignettes sudo tlmgr update --self sudo tlmgr update --all sudo tlmgr install titling framed inconsolata sudo tlmgr install collection-fontsrecommended
以及自己包所依赖的一些包,建议不要依赖太复杂的包,容易安装失败,然后用户就直接退出了。
用pkgdown来开发R包的网站,非常方便。
- https://pkgdown.r-lib.org/
- 用pkgdown为R程序包建立网站
做生信的最终梦想,就是自己开发一款热度极高的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()"
其实写个包还是挺难的,有太多注意事项了。
- 写一个函数,初步完成指定功能,明确输入输出;
- 函数名、变量名,API的泛化、debug;
- 撰写文档,一个参数都不能少;
- 确定依赖包,需要在description和namespace里说明;
- 通过check【check一下都要接近10分钟】;
很多事情都要不断的打磨:
- 泛化,随着测试数据集的变化,总有不同的condition,就需要不断的泛化
- 命名,根据对分析理解的加深,会有新的命名方法
删掉所有注释再提交到GitHub
设计原则
如何提交到Bioconductor?
文章发表
如果真想做一个好包,那就把开发的逻辑梳理清楚,然后投稿,差不多接收了就可以把包提交到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.
参考: