【问题标题】:What type of object is an R package?什么类型的对象是 R 包?
【发布时间】:2015-03-11 15:59:43
【问题描述】:

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

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

任何人都可以纠正我吗?

【问题讨论】:

  • 你可能对ls.str("package:packageName")印象更深
  • 一个包只是一组 R 函数(带有文档),它们由DESCRIPTION 和NAMESPACE 文件粘合在一起并组织起来。包本身不是 R 对象。
  • @Canuckish - 你必须像我一样输入它,ls.str("package:fpp") 函数ls.str 需要知道你要查看包内容
  • @Canuckish 我不确定是否真的有 object type 用于包,但按照@RichardScriven 的评论,我猜它最类似于@987654328 @,至少在某种意义上,您可以调用 ls(name="package:ggplot2")ls.str(name="package:ggplot2") 之类的东西。
  • 您可能会发现r-pkgs.had.co.nz/package.html 很有帮助

标签: r object install.packages


【解决方案1】:

我正在阅读 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 的集合。

【讨论】:

  • 有点像我要找的东西,但是如果 str 是为了“紧凑地显示 R 对象的内部结构”,为什么 str(package_name) 会抛出错误
  • 因为这完全是关于environments。您需要查看environments 章节中的上述链接。如果你加载一个包,它的environment 会添加到一组environments 中的全局环境之前。 environments 实际上是 R 查找每个对象的地方。除非您加载 package,否则 R 无法找到该名称的位置,因此您会收到错误。
  • 我不认为这句话真的对 OP 有帮助。事实上,它实际上是相当具有误导性的,因为“存在的一切都是对象”,但尽管看起来相反,就 R 而言,str(package_name) 中的package_name 确实 not 存在(并且不是对象),除非 OP 之前已定义它。
  • @KonradRudolph 但我在上面提到,包是对象的集合,而不是对象本身。
  • 最终,OP 关心的是包是什么类型的对象。 “对象集合”是一个很好的答案,但没有回答这个问题。也就是说,您的回答是说明性的,我很重视您的意见。
【解决方案2】:

你的问题是:

什么类型的对象是 R 包?

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

就 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 的 cmets。

【讨论】:

  • 啧啧啧……s/lib_name/pkg_name。 :) 我唯一要补充的是pkg_name 一个对象(包含函数参数的配对列表中的未绑定符号)......虽然这可能太技术性了。
  • 我认为这是一个该死的好答案,我在检查它或上面的@BondedDust 之间陷入了困境。因为他是我第一次检查,所以我要把它放回去。但我真的很喜欢这个回应。非常感谢。
  • 请注意,TypeTable 结构 found in src/main/util.c 显示了所有基本类型。 Package 不是其中之一。认为这可能对某人有用。 :)
  • 同意这个答案很有用。它是从某人从 R 控制台查看世界并解释遇到的错误的角度编写的。我是从在三个目标操作系统之一中使用 R 的人的角度编写的。
  • @Joshua 老实说,我对我的回答的这方面不满意,特别是因为library 并不是您可能遇到此问题的唯一相关地方(想想pkg::obj)。我仍在考虑是否更新我的答案,或者这是否会更令人困惑而不是有用。
【解决方案3】:

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 时附带的文档。

【讨论】:

    【解决方案4】:

    来自R's own documentation

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

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

    【讨论】:

    • 非常有用。但正如@Roland 指出的那样,它不是一个对象——所以它只是一个目录吗?
    • @Canuckish,没有包所在的目录称为library。这令人困惑,因为包是使用 library(foo) 函数调用加载的。我已修复上述答案中的超链接以指向正确的手册页。
    • 确实是在尝试获取包的“类型”——我很感兴趣的是,即使“R 中的所有内容都是向量”,我也必须使用特殊的(列表结构?)调用像上面推荐的`ls.str("package:package_name")。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多