R包開發(fā)的一些細(xì)節(jié)(1)

最近在忙著開發(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包磨确,很方便。

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è)自己的博客介紹自己的包儿捧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荚坞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菲盾,更是在濱河造成了極大的恐慌颓影,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿汞,死亡現(xiàn)場離奇詭異瞭空,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疗我,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門咆畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吴裤,你說我怎么就攤上這事旧找。” “怎么了麦牺?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵钮蛛,是天一觀的道長。 經(jīng)常有香客問我剖膳,道長魏颓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任吱晒,我火速辦了婚禮甸饱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仑濒。我一直安慰自己叹话,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布墩瞳。 她就那樣靜靜地躺著驼壶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喉酌。 梳的紋絲不亂的頭發(fā)上热凹,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音泪电,去河邊找鬼般妙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛歪架,可吹牛的內(nèi)容都是我干的股冗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼和蚪,長吁一口氣:“原來是場噩夢啊……” “哼止状!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起攒霹,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怯疤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后催束,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體集峦,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塔淤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘昌。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖高蜂,靈堂內(nèi)的尸體忽然破棺而出聪黎,到底是詐尸還是另有隱情,我是刑警寧澤备恤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布稿饰,位于F島的核電站,受9級特大地震影響露泊,放射性物質(zhì)發(fā)生泄漏喉镰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一惭笑、第九天 我趴在偏房一處隱蔽的房頂上張望侣姆。 院中可真熱鬧,春花似錦脖咐、人聲如沸铺敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偿凭。三九已至,卻和暖如春派歌,著一層夾襖步出監(jiān)牢的瞬間弯囊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工胶果, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾嘱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓早抠,卻偏偏與公主長得像霎烙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蕊连,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355