【问题标题】:How to manage multiple package locations (folders) in R?如何在 R 中管理多个包位置(文件夹)?
【发布时间】:2011-12-21 00:56:59
【问题描述】:

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

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

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

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

是否有一种简单的方法来管理包裹位置,例如通过在.RProfileRProfile.Site 中创建一些合理的设置/包装函数?

【问题讨论】:

标签: r installation package


【解决方案1】:

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

出于可重现性的目的,我尝试编写脚本,包括我的整个 R 设置。我有一个脚本“initializeR.r”,除其他外,它安装包,并且我已经将包安排在包中,例如与缓存相关的包,与可视化、采样、空间统计等相关的包 - 我自己的小任务视图,如果你愿意的话。

例如,这里是一个 sn-p:

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

我将一些捆绑包合并到“主要”包(或主要)列表中,而其他捆绑包则进入“次要”列表。我肯定会在主要列表中安装所有东西——这些都是需要有一个合理的 R 环境,使用我自己的脚本、函数和包等。(顺便说一句,一些包被分配给多个包,但只有少数;我在处理聚合列表之前进行了重复数据删除。)

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

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

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

【讨论】:

    【解决方案2】:

    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")
    

    是一种强大的方法。

    【讨论】:

      【解决方案3】:

      有很多选择。我做的第一件事是调整我的 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)
      

      我猜还有其他选择,但我会这样滚动。

      【讨论】:

      • 使用此方法时的警告说明:尝试使用 R CMD check ... 检查/构建/安装软件包时会导致复杂化。原因是R CMD checkR CMD build 不读取.Rprofile (cran.r-project.org/doc/manuals/…)。
      【解决方案4】:

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

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

      【讨论】:

      • 这里有同样的经历。这就是为什么我使用 .libPaths() 来设置这些。还因为 install.packages() 将 .libPaths() 的第一个值作为默认值。我只是发现它比摆弄环境变量更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2012-07-25
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多