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阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350