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

2020-08-05  本文已影响0人  Shaoqian_Ma

最近在忙着开发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

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")))
上一篇下一篇

猜你喜欢

热点阅读