最近在忙著開發(fā)COVID19的分析Shiny和R包缆毁,參考了很多R包和網(wǎng)頁開發(fā)的教程。這里先簡單介紹一些我的踩坑經(jīng)驗(yàn):
正式發(fā)布R包后到涂,我會介紹每個(gè)函數(shù)的參數(shù)設(shè)計(jì)和功能設(shè)計(jì)脊框,以及詳細(xì)的開發(fā)過程
為了方便測試,我們可以采用downsampled data践啄,或者自己制作simulated data浇雹,比如bioconductor上就有可以制作simulated single cell data object來衡量分析軟件的performance。
比如下面我選擇部分病毒樣本進(jìn)行分析屿讽,節(jié)約時(shí)間:
seqkit sample --proportion 0.1 Gisaid_RMD.fasta > Gisaid_RMD_10.fasta
[INFO] sample by proportion
[INFO] 4521 sequences outputted
Check
可以直接check()昭灵,或者check_rub(),前者只是初步檢查伐谈,后者要求更加嚴(yán)格烂完,后者的check結(jié)果基本上就是上傳到CRAN后自動(dòng)審核的結(jié)果。所以如果你的包能通過check_rub()的檢查诵棵,那么恭喜你抠蚣,至少你的包已經(jīng)滿足了通過CRAN初篩的要求了。
R包開發(fā)出現(xiàn)比較多的問題是:no visible global function definition非春。一般是note的形式
這種情況柱徙,一般是在函數(shù)內(nèi)部有的對象沒有進(jìn)行聲明造成的(只需要在函數(shù)內(nèi)部額外添加聲明即可,因?yàn)镽會以為這個(gè)對象莫名其妙的存在會導(dǎo)致和外部變量沖突)奇昙,或者有的函數(shù)沒有進(jìn)行import,如果沒有import敌完,在example運(yùn)行的時(shí)候也會報(bào)error(只需要在roxygen2模板里插入@importfrom + 包名 + 函數(shù) 即可)
文件不宜過大储耐,特別是data,可以嘗試save函數(shù)加上compress參數(shù)滨溉,R包要求build之后小于5MB
注意一點(diǎn)什湘,CRAN的check有時(shí)不兼容bioconductor的包长赞,尤其是比較老的包,比如Biostring闽撤。所以如果要用類似translate這樣的函數(shù)得哆,可以用seqinr包里的的代替,或者自己手寫函數(shù)代替它哟旗。否則Check會報(bào)錯(cuò):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
如果報(bào)錯(cuò)和xlim贩据,ylim有關(guān),很可能你的數(shù)據(jù)有缺省值或者0(比如對0取log)闸餐,有時(shí)說明是抽樣數(shù)據(jù)的問題饱亮。我當(dāng)時(shí)用的數(shù)據(jù)是downsampled data,一方面減少存儲舍沙,一方面運(yùn)行更快近上,而且產(chǎn)出結(jié)果基本不受影響。
最好不要在check examples時(shí)點(diǎn)擊stop拂铡,可能導(dǎo)致接下來的測試無法正常讀取數(shù)據(jù)壹无,需要全部退出R.studio
Bioconductor check
需要用devel版本進(jìn)行測試,安裝R4.0(我裝的是4.0.2)感帅。在bioconductor上正式發(fā)表包格遭,開發(fā)者必須使用最新的R。
記琢敉:每更新一次R版本都要重新安裝Rtools! 否則關(guān)鍵軟件會安裝失敗拒迅,比如devtools等需要編譯的包。而且Rtools要安裝在win-library目錄下她倘,記得添加環(huán)境變量璧微。
如果你的包通過了CRAN的要求,想嘗試bioconductor硬梁,注意以下幾個(gè)方面前硫,bioconductor會更注重一些細(xì)節(jié)問題補(bǔ)充文檔:https://r-pkgs.org/vignettes.html
http://cran.fhcrc.org/doc/manuals/R-exts.html#Writing-package-vignettes
vignettes非常重要!draft vignettes時(shí)荧止,需要預(yù)先devtools::install()屹电,否則會報(bào)錯(cuò):找不到R包。因?yàn)関ignettes和readme不一樣跃巡,readme用Rmarkdown生成時(shí)只需要load()就可以危号,但是vignettes因?yàn)樵谡包開發(fā)中(CRAN)是非必需的,而且形式比較自由素邪,所以非必需的目錄下的R文件運(yùn)行之前請保證運(yùn)行過devtools::install()
vignettes的風(fēng)格可以自定外莲,這里我推薦:
output:
BiocStyle::html_document:
toc_float: true
fig_caption: true
number_sections: true
bibliography: [bibliography.bib, packages.bib]
這是bioconductor標(biāo)準(zhǔn)的文檔風(fēng)格,bib選項(xiàng)可以自定義引用⊥迪撸可以引用paper也可以引用R包磨确,很方便。
參考包1:http://www.bioconductor.org/packages/release/workflows/html/methylationArrayAnalysis.html
-
參考包2:https://github.com/MSQ-123/esATAC
git clone https://github.com/MSQ-123/esATAC.git
指導(dǎo)文檔:http://www.bioconductor.org/developers/package-guidelines/#intro
-
Unit Test: https://r-pkgs.org/tests.html
- 可以通過檢測文件是否存在進(jìn)行測試声邦,比如這樣:
對于有outdir的函數(shù)乏奥,這是很合適的unit test。在check的時(shí)候系統(tǒng)會自動(dòng)運(yùn)行unit test亥曹。比較方便邓了,這樣可以避免你自己一個(gè)一個(gè)去手動(dòng)檢查
- 可以通過檢測文件是否存在進(jìn)行測試声邦,比如這樣:
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")))
添加數(shù)據(jù)的引用,完善數(shù)據(jù)說明也很重要歇式。不管是data目錄還是extdata目錄驶悟,data都要有完整的說明文檔
關(guān)于函數(shù)的output設(shè)置:無outdir則直接輸出到屏幕,適合vignettes的制作材失。
關(guān)于DESCRIPTION文件:biocViews變成必選痕鳍,至少有兩個(gè)terms才可以。
關(guān)于inst文件夾:inst是R包里面形式最自由的龙巨,任何你想放的東西都可以放笼呆,比如extdata。bioconductor會注重extdata旨别,尤其是workflow類型的包诗赌,因?yàn)橥婕皉aw data的處理,比如fasta文件秸弛。這時(shí)bioconductor會要求你把raw data放到extdata目錄下铭若,而且配置一個(gè)詳細(xì)的說明文檔來說明raw data的來源。比如我們開發(fā)的包要用到nucmer.snps文件递览,那么這個(gè)data是怎么從downloaded fasta用shell腳本得到的叼屠,shell腳本也要放上,方便其他用戶重復(fù)你的結(jié)果绞铃。
文檔的format很重要:每一行的char不要太多
關(guān)于Github:bioconductor要求作者使用Github進(jìn)行版本控制镜雨,并開放issue。感興趣的還可以通過github.io做一個(gè)自己的博客介紹自己的包儿捧。