10.2 加载包

你可以使用library函数来加载电脑上那些已经安装的包。但公认的更好的选择是使用load_package,它可以避免很多混淆。然而,因为library函数存在太久了,现在改变习惯为时已晚。就术语来说,(package)是一系列R函数和数据集的集合;(library)是你电脑上文件夹,而包就存储于文件夹内的文件中3

3 请注意,R-help邮件列表中的一些人士认为把这两个术语混淆是罪大恶极的。

如果你有一个标准版本的R——也就是说,你还没有从R的源代码构建自定义的R版本——那么lattice包已经被默认安装了,但它不会自动加载。我们可以使用library函数加载它:

  1. library(lattice)

现在,我们可以使用所有由lattice包所提供的函数。例如,图10-1显示了著名的Immer's barley数据集的点状图。

  1. dotplot(
  2. variety ~ yield | site,
  3. data = barley,
  4. groups = year
  5. )

图像说明文字

图10-1:Immer's barley数据集点状图

注意 lattice包将在第14章详细讨论。

请注意,包的名称在传递给library库时并不需要被引号括起来。如果你想用编程方式把包的名字传递给library,可以设置参数character.only = TRUE。如果你有很多的包需要加载,这会有些用处:

  1. pkgs <- c("lattice", "utils", "rpart")
  2. for(pkg in pkgs)
  3. {
  4. library(pkg, character.only = TRUE)
  5. }

如果你使用library来加载一个未安装的包,它会抛出一个错误。如果你想用不同的方式来处理这种情况,可以试试require函数。和library一样,require会加载一个包,不过它不会抛出一个错误而是通过判断包是否被成功加载而返回TRUEFALSE

  1. if(!require(apackagethatmightnotbeinstalled))
  2. {
  3. warning("The package 'apackagethatmightnotbeinstalled' is not available.")
  4. # 或者尝试去下载它
  5. #...
  6. }

10.2.1 搜索路径

你可以使用search函数查看所有已加载了的包:

  1. search()
  2. ## [1] ".GlobalEnv" "package:stats" "package:graphics"
  3. ## [4] "package:grDevices" "package:utils" "package:datasets"
  4. ## [7] "package:methods" "Autoloads" "package:base"

这个列表显示:R是在哪里、以什么顺序搜索变量的。全局环境永远都是第一位的,其次是最近加载的包。最后两个值,一个是特殊的始终被称为Autoloads的环境,另一个是base包。当你在全局环境中定义了一个名为var的变量,在它从stats包中找到常用的方差函数之前,R会首先在全局环境中发现它,因为全局环境始终在搜索列表的最前面。当你创建任何环境(参加第6章)时,它们也会出现在搜索路径中。

10.2.2 库和已安装的包

installed.packages函数将返回一个数据框,它包含了R所知道的你电脑上所有包的信息。如果你使用R已经有一段时间了,包的数目很可能有几百个,所以最好还是远离控制台来查看结果:

  1. View(installed.packages())

installed.packages将为你提供电脑硬盘中每个版本的安装包的信息、它所依赖的其他包以及其他信息。在LibPath一列中提供了包的文件位置信息,这会告诉你它们的库在哪里。这时你可能想知道R如何决定哪些文件夹被认作是库。

注意 以下的解释有些过于专业,你不必记住R是如何找到包这样的细节。这些信息在你选择升级R,或当你加载包出现问题时能帮你节省一些时间,但在R的日常工作中不是必需的。

R安装时就自带的包(basestats以及其他大概30个)都存储在你安装R的library子目录中。你可通过以下方法取得这个位置:

  1. R.home("library") #或者
  2. ## [1] "C:/PROGRA~1/R/R-devel/library"
  3. .Library
  4. ## [1] "C:/PROGRA~1/R/R-devel/library"

在安装包时,你还得到一个只能由你访问的用户库(如果不希望你六岁大的小朋友更新家中电脑安装的包并破坏了代码的兼容性,这是非常有用的)。这个位置取决于操作系统。在Windows下,对于R的x.y.z版本,它在Home目录的R/win-library/x.y子目录中,Home目录可以通过以下方式找到:

  1. path.expand("~") #or
  2. ## [1] "C:\\Users\\richie\\Documents"
  3. Sys.getenv("HOME")
  4. ## [1] "C:\\Users\\richie\\Documents"

在Linux下,文件夹同样位于Home目录之下的R/R.version$platform-library/x.y子文件夹中。R.version$platform通常会返回一个类似于“i686-pc-linux-gnu”的字符串,你可以使用与Windows相同的方式找到它的Home 录。在Mac OS X中,你可以在Library/R/x.y/library库中找到它。

与库位置的默认设置相关的一个问题是,当你升级R时需要重新安装所有的包。这是最安全的行为,因为不同版本的R常常需要使用不同版本的包。但在实际中,在开发机器上避免重新安装包往往要比版本问题更为重要4。为了方便,更好的方法是创建你自己的库,使之适用于R的所有版本。为此,最简单的方法是定义一个环境变量包R_LIBS,它将包含你想要的库位置的路径5。虽然你可以通过在R中编程来定义环境变量,但它们只适用于R,且仅用于会话的其余部分——而不是将它们定义在你的操作系统中。

4 如果你正在把R程序部署为应用程序的一部分,那么情况就不同了。在这种情况下兼容性会胜出。

5 可以用分号分隔出多个位置,但这可能小题大做了。

你可以用.libPaths函数查看R所知道的所有字符向量 :

  1. .libPaths()
  2. ## [1] "D:/R/library"
  3. ## [2] "C:/Program Files/R/R-devel/library"

此向量的第一个值最为重要,因为这是包将被默认安装的位置。