R包是什么类型的对象?

What type of object is an R package?

可能是一个非常基本的问题,但我和一个朋友试图 运行 str(packge_name) 并且 R 抛给了我们一个错误。现在我正在看它,我想知道 R 包是否像 .zip 文件,因为它是对象的集合,比如图片和歌曲,而不是图片或歌曲本身。

如果我尝试使用图像查看器打开压缩图片,在我解压缩之前它不知道该做什么 - 就像我不能调用 str(forecast) 但我可以调用 str(ts) 一旦我将预测包加载到我的库中...

谁能帮我弄清楚?

我正在阅读 Hadley 的书 Advanced-R(第 6.3 章 - 函数,第 79 页),我认为这句话将涵盖您:

Every operation is a function call
“To understand computations in R, two slogans are helpful:

Everything that exists is an object.
Everything that happens is a function call."
— John Chambers

据称,使用 library(name_of_library) 是一个将加载包的函数调用。已加载的每一点,即函数或数据集都是 objects,您可以通过调用其他函数来使用它们。从这个意义上说,一个包在任何 R 的环境中都是 而不是 object 直到它被加载。那么你可以说它是它包含的 objects 和加载的

的集合。

来自R's own documentation

Packages provide a mechanism for loading optional code, data and documentation as needed.…A package is a directory of files which extend R, a source package (the master files of a package), or a tarball containing the files of a source package, or an installed package, the result of running R CMD INSTALL on a source package. On some platforms (notably OS X and Windows) there are also binary packages, a zip file or tarball containing the files of an installed package which can be unpacked rather than installing from sources. A package is not a library.

所以是的,包不是其中的功能;它是一种让 R 能够使用包含包的函数或数据的机制。因此,需要先加载它。

R 包通常作为压缩文件包分发。它们可以是 "binary" 形式,在存储库中进行预处理以编译任何 C 或 Fortran 源代码并创建适当的 headers,或者它们可以是源代码形式,其中可以使用各种所需的文件在安装过程中使用,但这需要用户在使用 OS 系统资源的 R 构建过程可以访问的位置安装必要的编译器和工具。

如果您在 CRAN 阅读了某个包的文档,您会发现它们以一组压缩格式分发,这些格式因 OS-targets:

而异
Package source:     Rcpp_0.11.3.tar.gz  # the Linus/UNIX targets
Windows binaries:   r-devel: Rcpp_0.11.3.zip, r-release: Rcpp_0.11.3.zip, r-oldrel: Rcpp_0.11.3.zip
OS X Snow Leopard binaries:     r-release: Rcpp_0.11.3.tgz, r-oldrel: Rcpp_0.11.3.tgz
OS X Mavericks binaries:    r-release: Rcpp_0.11.3.tgz
Old sources:    Rcpp archive   # not really a file but a web link

安装后,R 包将具有指定的目录结构。 DESCRIPTION 文件是一个文本文件,其中包含用于确定本地安装是否满足包依赖性的组件的特定条目。有 NAMESPACE、LICENSE 和 INDEX 文件。有名为“/help”、“/html”、“/Meta”、“/R”的目录,可能还有“/libs”、“/demo”、“/data”、“/unitTests”、和其他人。

这是 ../library/Rcpp 包目录顶部的树:

$ ls
CITATION    NAMESPACE   THANKS      examples    libs
DESCRIPTION NEWS.Rd     announce    help        prompt
INDEX       R       discovery   html        skeleton
Meta        README      doc     include     unitTests

所以在一个包的 "life-cycle" 中,最初会有一系列必需的和可选的文件,然后通过 BUILD 和 CHECK 机制将其处理成一个已安装的包,然后将其压缩分发,然后解压到用户机器上的指定目录树中。请参阅这些帮助页面:

?.libPaths  # also describes .Library()
?package.skeleton
?install.packages
?INSTALL

当然还要阅读 Writing R Extensions,这是每次安装 R 时都会附带的文档。

您的问题是:

What type of object is an R package?

不知何故,我仍然没有找到这个确切问题的答案。所以这里是:

就 R 而言,R 包不是对象。也就是说,它不是 R 类型的对象系统。 R有点难,因为它允许你写

library(pkg_name)

无需您事先在任何地方定义 pkg_name。相比之下,您在 R 中使用的其他对象必须在某处定义 – 由您定义,或者由显式或隐式加载的某些包定义。

这很不幸,也让人感到困惑。因此,当你看到library(pkg_name)时,就会想到

library('pkg_name')

也就是说,想象一下引号中的包名称。这实际上确实如预期的那样工作。该代码在 没有 引号的情况下也可以工作,这是 library 函数的一个特性,称为 non-standard evaluation。在这种情况下,这主要是一个不幸的设计决定(但有原因)。

因此,重复一下答案:包不是 R 对象的一种类型1。对于 R,它只是一个指向文件系统中已知位置的名称,与您假设的相似。 BondedDust的回答里面详细解释了那个结构,这里就不重复了。


1 有关超级技术细节,请参阅下面 Joshua 和 Richard 的评论。