可能是一个非常基本的问题,但朋友和我试图运行str(packge_name)
并且R给我们一个错误。现在我正在看它,我想知道R包是否像.zip文件,因为它是一个对象集合,比如图片和歌曲,但不是图片或歌曲本身。
如果我试图用图像浏览器打开一个拉链图片,在解压缩之前它不知道该做什么 - 就像我不能打电话给str(forecast)
但我可以打电话我已将预测包加载到我的库中后str(ts)
...
有人能帮我直接吗?
答案 0 :(得分: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包将具有指定的目录结构。 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
所以在"生命周期"对于一个包,最初会有一系列必需和可选的文件,然后由BUILD和CHECK机制处理成一个已安装的包,然后进行压缩以便分发,然后解压缩到用户的指定目录树中机。请参阅以下帮助页面:
?.libPaths # also describes .Library()
?package.skeleton
?install.packages
?INSTALL
当然还可以阅读Writing R Extensions,这是R的每次安装都随附的文档。
答案 1 :(得分:19)
你的问题是:
什么类型的对象是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的评论。
答案 2 :(得分:5)
包提供了一种加载可选代码,数据和的机制 根据需要提供文档。...包是文件的目录 extend R,源包(包的主文件)或a 包含源包文件或已安装文件的tarball package,在源包上运行R CMD INSTALL的结果。上 一些平台(特别是OS X和Windows)也有二进制 包,包含已安装文件的zip文件或tarball 包装可以解压缩而不是从源头安装。一个 包不是图书馆。
所以是的,包不是其中的功能;它是一种让R能够使用构成包的功能或数据的机制。因此,需要先加载它。
答案 3 :(得分:4)
我正在阅读哈德利的书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
的集合,并且已经加载了它。