自动在R中创建个人库

17

当你在R中尝试安装软件包并且没有访问默认库路径的权限时,R会询问:

 

你想使用个人库吗?

 

您是否要创建一个个人库'〜/path'以安装软件包?

但是,如果您正在运行R脚本,这些消息将不会显示,安装将失败。我可以预定义一个特定的路径并指示install.packages使用它,但我不想创建一个仅针对此R脚本的附加库路径。我只想使用默认的个人库。有没有一种方法强制创建个人库而无需交互?


1
更新.libPaths()? - zx8754
4
你应该仔细阅读install.packages提供的help(".libPaths"),其中包含了一个链接。该文档解释了R语言中库搜索路径的初始化方式,首先会从环境变量R_LIBS中获取以冒号分隔的目录列表,这些目录是R语言库树的根目录,然后再加上R_LIBS_USER环境变量中的目录。只有那些在此时存在的目录才会被包含进来。默认情况下,R_LIBS未设置,而R_LIBS_USER被设置为主目录下名为‘R/R.version$platform-library/x.y’的目录(对于CRAN OS X版本,则为‘Library/R/x.y/library’),其中x.y.z为当前使用的R版本号。 - hrbrmstr
6
说了这么多,我其实不太喜欢分析脚本安装包。也许我是少数派,同时我也是一个强迫症的网络安全专家,但我更愿意有一个我手动运行的 pkg 安装脚本或一个预检脚本,在其中通知我我缺少什么,特别是如果一个脚本依赖于较旧或较新的包版本而我正在运行特定版本的原因。 - hrbrmstr
拥有在分析脚本之前以单独的上下文运行的安装脚本是可以的。但是,如果该安装脚本本身是完全自动化的,则需要一个简单的方法使该安装用户(非根用户)能够安装软件包而无需任何手动交互。例如,pip具有可传递的 user 标志,可告诉它使用当前用户的主目录而不是系统目录。install.packages 已经具备了执行此操作并确定用户软件包的位置的功能。它应该具有一个可选参数 user,我可以将其设置为 TRUE. - theferrit32
我现在的解决方法是让安装脚本创建~/.local/lib/R,然后使用R_LIBS_USER=~/.local/lib/R R运行R。 - theferrit32
1
我不同意R脚本必须是分析脚本的前提。我认为有很多情况下我们可能需要编写一个在R中处理依赖关系的预处理脚本。 - Shape
1个回答

16

您可以使用Sys.getenv("R_LIBS_USER")来获取本地库搜索位置。

这就是我最终采取的方法,似乎有效(最难的部分是测试解决方案,因为问题只会在您尝试安装软件包的第一次出现):

# create local user library path (not present by default)
dir.create(path = Sys.getenv("R_LIBS_USER"), showWarnings = FALSE, recursive = TRUE)
# install to local user library path
install.packages(p, lib = Sys.getenv("R_LIBS_USER"), repos = "https://cran.rstudio.com/")
# Bioconductor version (works for both Bioconductor and CRAN packages)
BiocManager::install(p, update = FALSE, lib = Sys.getenv("R_LIBS_USER"))

如评论中@hrbrmstr所指出的,强制安装软件包可能不是一个好主意,因此使用时需自行承担风险。


1
请注意,不应再使用biocLite从Bioconductor安装软件包。请使用BiocManager :: install() - llrs
需要注意的是:虽然您可以在环境中设置R_LIBS_USER,并且R将尊重该设置,但即使在环境中未设置R_LIBS_USERSys.getenv("R_LIBS_USER")仍将返回有意义的内容。 - bers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接