22

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

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

谁能让我直截了当?

4

4 回答 4

22

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

如果您阅读 CRAN 的软件包文档,您会发现它们以一组压缩格式分发,这些格式因操作系统目标而异:

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 包将具有指定的目录结构。描述文件是一个文本文件,其中包含用于确定本地安装是否满足包的依赖项的组件的特定条目。有 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

因此,在包的“生命周期”中,最初会有一系列必需和可选文件,然后由 BUILD 和 CHECK 机制处理成已安装的包,然后压缩分发,然后解包进入用户机器上的指定目录树。请参阅这些帮助页面:

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

当然,还要阅读编写 R 扩展,这是每次安装 R 时附带的文档。

于 2015-01-13T16:34:44.937 回答
19

你的问题是:

什么类型的对象是 R 包?

不知何故,我仍然缺少这个确切问题的答案。所以这里是:

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

library(pkg_name)

无需您pkg_name事先定义任何地方。相反,您在 R 中使用的其他对象必须在某个地方定义——要么由您定义,要么由显式或隐式加载的某个包定义。

这是不幸的,并且使人们感到困惑。因此,当你看到 时library(pkg_name),认为

library('pkg_name')

也就是说,想象一下引号中的包名称。这确实按预期工作。代码在没有引号的情况下也可以工作的事实是该library函数的一个特性,称为非标准评估。在这种情况下,这主要是一个不幸的设计决定(但有原因)。

因此,重复答案:包不是 R 对象1的类型。对于 R,它只是一个名称,它指的是文件系统中的已知位置,类似于您所假设的。BondedDust 的回答详细解释了该结构,所以我不会在这里重复。


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

于 2015-01-13T16:49:41.137 回答
5

来自R 自己的文档

包提供了一种根据需要加载可选代码、数据和文档的机制。...包是扩展 R 的文件目录、源包(包的主文件)或包含源包文件的 tarball,或已安装的包,在源包上运行 R CMD INSTALL 的结果。在某些平台(尤其是 OS X 和 Windows)上,还有二进制包、一个 zip 文件或 tarball,其中包含已安装包的文件,可以将其解包而不是从源安装。包不是库。

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

于 2015-01-13T16:30:02.843 回答
4

我正在阅读 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

根据该 usinglibrary(name_of_library)是一个将加载包的函数调用。已加载的每一点(即函数或数据集)都objects可以通过调用其他函数来使用。从这个意义上说,一个包在加载之前不在任何 R 环境中。object然后你可以说它是objects它包含和加载的集合。

于 2015-01-13T16:23:04.447 回答