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
和加载的
的集合。
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 的评论。
可能是一个非常基本的问题,但我和一个朋友试图 运行 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
和加载的
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 的评论。