R包开发的一些细节(1)

最近在忙着开发COVID19的分析Shiny和R包,参考了很多R包和网页开发的教程。这里先简单介绍一些我的踩坑经验:

正式发布R包后,我会介绍每个函数的参数设计和功能设计,以及详细的开发过程

为了方便测试,我们可以采用downsampled data,或者自己制作simulated data,比如bioconductor上就有可以制作simulated single cell data object来衡量分析软件的performance。
比如下面我选择部分病毒样本进行分析,节约时间:

seqkit sample --proportion 0.1 Gisaid_RMD.fasta > Gisaid_RMD_10.fasta
[INFO] sample by proportion
[INFO] 4521 sequences outputted

Check

可以直接check(),或者check_rub(),前者只是初步检查,后者要求更加严格,后者的check结果基本上就是上传到CRAN后自动审核的结果。所以如果你的包能通过check_rub()的检查,那么恭喜你,至少你的包已经满足了通过CRAN初筛的要求了。

R包开发出现比较多的问题是:no visible global function definition。一般是note的形式

这种情况,一般是在函数内部有的对象没有进行声明造成的(只需要在函数内部额外添加声明即可,因为R会以为这个对象莫名其妙的存在会导致和外部变量冲突),或者有的函数没有进行import,如果没有import,在example运行的时候也会报error(只需要在roxygen2模板里插入@importfrom + 包名 + 函数 即可)

文件不宜过大,特别是data,可以尝试save函数加上compress参数,R包要求build之后小于5MB
注意一点,CRAN的check有时不兼容bioconductor的包,尤其是比较老的包,比如Biostring。所以如果要用类似translate这样的函数,可以用seqinr包里的的代替,或者自己手写函数代替它。否则Check会报错:dependency error

 Note: significantly better compression could be obtained
           by using R CMD build --resave-data
                     old_size new_size compress
     covid_annot.rda    759Kb    480Kb       xz
     nucmer.rda         1.3Mb    397Kb       xz
     nucmerr.rda        1.6Mb    530Kb       xz
     refseq.rda          14Kb      8Kb    bzip2

如果报错和xlim,ylim有关,很可能你的数据有缺省值或者0(比如对0取log),有时说明是抽样数据的问题。我当时用的数据是downsampled data,一方面减少存储,一方面运行更快,而且产出结果基本不受影响。

最好不要在check examples时点击stop,可能导致接下来的测试无法正常读取数据,需要全部退出R.studio

Bioconductor check

  • 需要用devel版本进行测试,安装R4.0(我装的是4.0.2)。在bioconductor上正式发表包,开发者必须使用最新的R。
    记住:每更新一次R版本都要重新安装Rtools! 否则关键软件会安装失败,比如devtools等需要编译的包。而且Rtools要安装在win-library目录下,记得添加环境变量。
    如果你的包通过了CRAN的要求,想尝试bioconductor,注意以下几个方面,bioconductor会更注重一些细节问题

  • 补充文档:https://r-pkgs.org/vignettes.html

  • http://cran.fhcrc.org/doc/manuals/R-exts.html#Writing-package-vignettes
    vignettes非常重要!draft vignettes时,需要预先devtools::install(),否则会报错:找不到R包。因为vignettes和readme不一样,readme用Rmarkdown生成时只需要load()就可以,但是vignettes因为在正常R包开发中(CRAN)是非必需的,而且形式比较自由,所以非必需的目录下的R文件运行之前请保证运行过devtools::install()
    vignettes的风格可以自定,这里我推荐:

output:
  BiocStyle::html_document:
    toc_float: true
    fig_caption: true
    number_sections: true
bibliography: [bibliography.bib, packages.bib]

这是bioconductor标准的文档风格,bib选项可以自定义引用。可以引用paper也可以引用R包,很方便。

td<-tempdir()
  #setTmpDir(td)

  Total <- 11000
  data("nucmerr")
  data("assays")
  AssayMutRatio(nucmerr = nucmerr,
                assays = assays,
                totalsample = Total,
                plotType = "logtrans",
                outdir = td)
#file.exists()检查文件是否存在
  expect_true(file.exists(file.path(td,"Charite-E",".png")))
  expect_true(file.exists(file.path(td,"Charite-RdRP",".png")))
  expect_true(file.exists(file.path(td,"ChinaCDC-N",".png")))
  • 添加数据的引用,完善数据说明也很重要。不管是data目录还是extdata目录,data都要有完整的说明文档

  • 关于函数的output设置:无outdir则直接输出到屏幕,适合vignettes的制作。

  • 关于DESCRIPTION文件:biocViews变成必选,至少有两个terms才可以。

  • 关于inst文件夹:inst是R包里面形式最自由的,任何你想放的东西都可以放,比如extdata。bioconductor会注重extdata,尤其是workflow类型的包,因为往往涉及raw data的处理,比如fasta文件。这时bioconductor会要求你把raw data放到extdata目录下,而且配置一个详细的说明文档来说明raw data的来源。比如我们开发的包要用到nucmer.snps文件,那么这个data是怎么从downloaded fasta用shell脚本得到的,shell脚本也要放上,方便其他用户重复你的结果。

  • 文档的format很重要:每一行的char不要太多

  • 关于Github:bioconductor要求作者使用Github进行版本控制,并开放issue。感兴趣的还可以通过github.io做一个自己的博客介绍自己的包。

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