R包的結構和形式

參考:https://r-pkgs.org/package-structure-state.html#binary-package

Package structure and state

Package states

R包一共有5種states:

  • source
  • bundled
  • binary
  • installed
  • in-memory

install.packages()devtools::install_github()都是從source, bundled, binary這些states轉成 installed states。而library()則是使installed package變成in-memory

Source package

源碼包就是一個目錄下面有著特定的結構,就像我們自己開發R包最開始產生的那個目錄結構一樣,包括DESCRIPTION文件、R/目錄下放著函數的.R文件等等。

如果需要查看源碼包,直接找上CRAN即可(當然如果是bioconductor包,去找相應的Github就是),eg.

其中一個會給出來的鏈接就是:在Github上公開的

有的作者可能忘記添加這種URL了,不過肯定也是可以找到的。

如果有的包不是在公共平臺上發布的,也可以在一些非官方的、僅可讀的鏡像上如 METACRAN上找到。比如:

Bundled package

Bundled package就是經過壓縮打包的R包。在linux上經常就是.tar.gz格式,意味著這個state就是把很多文件打包起來(.tar)然后再gzip壓縮(.gz)。這種state主要是方便傳輸,一般是一種中間形式。

如果要對本地開發的R包制作這種state,可以使用devtools::build(),相當于是調用了 pkgbuild::build() 并最終 R CMD build,更詳細的信息可以參考:https://cran.r-project.org/doc/manuals/R-exts.html#Building-package-tarballs

但是實際情況是,一個bundled包并不是簡單地tar打包然后gzip壓縮做成的,在R里面,制作一個.tar.gz文件實際上還有更多其他操作。

舉例來說,forcats_0.4.0.tar.gz下載后,終端解壓:

tar xvf forcats_0.4.0.tar.gz

這樣解壓以后,你會發現實際上就和source package的結構相當,重要states內容比較如下:

package_states.png

總結來說,source package和uncompressed bundle之間主要的區別就是:

  • Vignettes have been built, so rendered outputs, such as HTML, appear below inst/doc/ and a vignette index appears in the build/ directory, usually alongside a PDF package manual.
  • A local source package might contain temporary files used to save time during development, like compilation artefacts in src/. These are never found in a bundle.
  • Any files listed in .Rbuildignore are not included in the bundle. These are typically files that facilitate your development process, but that should be excluded from the distributed product.

.Rbuildignore

這個就和版本控制工具如Git的.gitignore相似,這個文件決定了什么文件會進一步被用到下游形式中(如bundle),什么文件會被拋棄。

文件是用正則表達式寫的,如下面這樣:

^foofactors\.Rproj$
^\.Rproj\.user$
^LICENSE\.md$
^README\.Rmd$

每一個以^開頭$結尾的文件都是會被后期拋棄的,這種文件只是在開發過程中起作用。為了避免正則表達式寫錯,最安全的排除指定文件的做法是:

usethis::use_build_ignore("notes")

總的來說:這個文件就是讓你的開發更方便,你需要不停做測試和修改,然而有些中間文件并不能上傳到CRAN上。

.Rbuildignore is a way to resolve some of the tension between the practices that support your development process and CRAN’s requirements for submission and distribution

可能涉及到的中間文件包括:

  • Files that help you generate package contents programmatically. Examples:
    • Using README.Rmd to generate an informative and current README.md.
    • Storing .R scripts to create and update internal or exported data.
  • Files that drive package development, checking, and documentation, outside of CRAN’s purview. Examples:
    • Files relating to the RStudio IDE.
    • Using the pkgdown package to generate a website.
    • Configuration files related to continuous integration/deployment and monitoring test coverage.

舉例:tidyverse 注意這里只是為了展示,真實情況不一定

^.*\.Rproj$         # Designates the directory as an RStudio Project
^\.Rproj\.user$     # Used by RStudio for temporary files
^README\.Rmd$       # An Rmd file used to generate README.md
^LICENSE\.md$       # Full text of the license
^cran-comments\.md$ # Comments for CRAN submission
^\.travis\.yml$     # Used by Travis-CI for continuous integration testing
^data-raw$          # Code used to create data included in the package
^pkgdown$           # Resources used for the package website
^_pkgdown\.yml$     # Configuration info for the package website
^\.github$          # Contributing guidelines, CoC, issue templates, etc.

Binary package

如果需要把R包分享給其他沒有R包開發經驗的用戶,就需要用到binary package,而且這種包的形式是平臺特異的。比如Windows和macOS。如果需要制作一個二進制包,需要使用如下代碼:

devtools::build(binary = TRUE)

不過一般最開始制作這種二進制包并發布的是CRAN,用戶并不需要。在CRAN上提交package bundle,然后它會幫你發布二進制的包。

Installed package

安裝后的包就是二進制包解壓以后的package library。下圖展示了包下載的一些方式,實際情況還要復雜很多:

installation.png

Package libraries

查看可用的包:

# on Windows
.libPaths()
#> [1] "C:/Users/jenny/Documents/R/win-library/3.6"
#> [2] "C:/Program Files/R/R-3.6.0/library"

lapply(.libPaths(), list.dirs, recursive = FALSE, full.names = FALSE)
#> [[1]]
#>   [1] "abc"           "anytime"       "askpass"       "assertthat"   
#>  ...
#> [145] "zeallot"      
#> 
#> [[2]]
#>  [1] "base"         "boot"         "class"        "cluster"     
#>  [5] "codetools"    "compiler"     "datasets"     "foreign"     
#>  [9] "graphics"     "grDevices"    "grid"         "KernSmooth"  
#> [13] "lattice"      "MASS"         "Matrix"       "methods"     
#> [17] "mgcv"         "nlme"         "nnet"         "parallel"    
#> [21] "rpart"        "spatial"      "splines"      "stats"       
#> [25] "stats4"       "survival"     "tcltk"        "tools"       
#> [29] "translations" "utils"

我們可以看到R的library分成了兩類:

  1. A user library
  2. A system-level or global library

第一類就是用戶自己后來添加的包,從CRAN、bioconductor等各處的都有。第二類是核心包,比如base,系統默認自帶的。目的是方便管理,其他安裝的包的添加或刪除不會干擾到原來的基礎包。

從path中也可以反映出,如果要對R進行升級更新,比如從3.5 到3.6(minor version),那么需要重新安裝包。但是如果是R 3.6.0到3.6.1(patch release),就不需要重新安裝。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375