如何管理R中的多个包位置(文件夹)?

时间:2011-11-03 10:05:27

标签: r installation package

在升级到R-2.14之前,我想借此机会合理化已安装软件包的文件夹结构。

目前我使用R默认值,即所有新安装的软件包都转到R_LIBS_USER。但是,我真的区分了两类包:

  • 我多次用来做我的工作的套餐,例如plyrdata.table
  • 我安装的软件包只是为了试验(通常是在StackOverflow上复制问题或答案)

由于install.packages提供了一个指定lib参数的选项,显然这是可能的。

是否有一种简单的方法来管理包裹位置,例如通过在.RProfileRProfile.Site

中创建一些合理的设置/包装函数

4 个答案:

答案 0 :(得分:25)

有很多选择。我做的第一件事是调整我的Rprofile.site以包含以下行,使我的默认库路径成为我的R安装中未包含的目录。

 .libPaths(c("D:/R/Library",.libPaths()))

这使D:/R/Library成为我的默认路径,而不会丢失其他路径。您可以添加两个路径,例如D:/R/Library/WorkD:/R/Library/Test。如果您未在install.packages()中指定lib,则放在第一个位置的是默认值。

然后,您可以在.Rprofile.site中分配两个变量。这些在基本命名空间中分配,因此始终可以访问,而不是由ls()删除。像

这样的东西
 .libwork <- 'D:/R/Library/Work'
 .libtest <- 'D:/R/Library/Test'

允许您安装以下软件包:

 install.packages('aPackage',lib=.libwork)

我猜也有其他选择,但这就是我要滚动的方式。

答案 1 :(得分:21)

Hadley的优秀包devtools提供了一个功能dev_mode http://www.inside-r.org/packages/cran/devtools/docs/dev_mode

您可以在此处找到一个示例用法:https://gist.github.com/1150934

基本上,

dev_mode(TRUE, path = "anywhere-you-want-to-install")
install.packages("anything-that-you-want-to-install")

是一种强有力的方式。

答案 2 :(得分:4)

您应该能够通过环境变量R_LIBS中以冒号分隔的路径列表指定多个库路径/树。我无法在R 2.13.1-patched上可靠地工作 - 它只需要第一个条目。我让R_LIBSR_LIBS_USER在我的系统上可靠地工作 - 我通常只设置前者。

.libPaths()可以为搜索到的库树集添加新路径。我只需在.libPaths(new)中添加适当的.Rprofile调用,即可为每个会话添加相关树。然后,您可以选择在安装时安装软件包的位置 - 即使用哪个树。

答案 3 :(得分:2)

要回答,我必须提供一些背景信息。

出于可重现性的目的,我尝试编写内容,包括我的整个R设置。我有一个脚本“initializeR.r”,其中包括安装软件包,我已经安排了软件包,例如与缓存有关的软件包,与可视化,抽样,空间统计等有关的软件包 - 我自己的小东西任务视图,如果你愿意的话。

例如,这是一个片段:

# Profiling & testing
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit")

我将一些捆绑包组合成“主要”包(或主要)列表,其他捆绑包进入“辅助”列表。我肯定会在主列表中安装所有内容 - 这些都需要有一个合理的R环境,使用我自己的脚本,函数和包等。(顺便说一下,有些软件包分配给多个软件包,但只有少数几个;在处理汇总列表之前,我会删除它。)

然后我指定一个特定于平台的默认库,并安装到那里。但是,此功能是可扩展的,并且可以扩展此功能以包括每个软件包(或软件包)的可选位置:只需从软件包名称映射,例如, “CodingTools”到一个唯一的目录(库路径),比如“D:/ R / Library / CodingTools”。这可以在初始化脚本中完成,匹配列表&amp;默认选项,或位置可以存储在别处,例如哈希表,JSON或数据库。

正如其他人所说,默认库路径需要传递给R.可以在.RProfile.site中完成。在我的例子中,我有另一个脚本,用于初始化我想要的R实例。我尝试避免使用R读取的外部参数文件(例如.Rprofile),而是通过我自己的包中的函数调用进行所有初始化(尽管参数仍然是外部的)。这往往使我更容易调试和重现我的工作。因此,我的库路径可以包含在指定数据文件位置的同一种JSON中。

就个人而言,我想摆脱在脚本中定义bundle而不是使用JSON,因为我可以更轻松地为不同的设置配置创建不同的JSON文件。我已经将其用于可重复工作的大多数其他目的。