优雅地加载 R 中的字符串包名列表

4

你好,我已经写好下面的代码:

################# Loadin Require Libraries #################
required.packages <- c('caret','readxl')
for (pkg in required.packages){
  if(!require(pkg, character.only = T)){
    install.packages(pkg,
                     character.only = T,
                     dependencies = T)
    library(pkg, character.only = T)
  }else{
    library(pkg, character.only = T)
  }

代码将在同行的计算机上运行,因此为了处理可能缺失的库,我想要通过遍历字符串列表来检查包是否已安装,如果是,则加载,如果不是,则安装并加载。然而,当一个包不可用时,R仍会输出警告消息:

In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, : es gibt kein Paket namens ‘readxl’

我的问题是:有没有更好的方法来检查/安装大量的R库?我是否应该关注这个警告?如果它不重要,有没有办法抑制打印出这个警告?

编辑:最终解决方案 感谢 @akrun 提供的正确答案:

################# Loadin Require Libraries #################
lib <- .libPaths()[1]
required.packages <- c('caret','readxl')
i1 <- !(required.packages %in% row.names(installed.packages()))
if(any(i1)) {
  install.packages(required.packages[i1], dependencies = TRUE, lib = lib) 
}
lapply(required.packages, require, character.only = TRUE)

2021更新 - Pacman

我发现 pacman 包在这方面非常有用,特别是其中的 p_load 函数。它会检查包是否已经安装,如果没有则尝试安装缺失的包。

该函数是 library 和 require 的包装器。它检查是否安装了某个包,如果没有,则尝试从 CRAN 和/或任何其他存储库中安装该包。

所以现在,我启动所有需要“可移植性”的脚本时都会加入以下代码:

require(pacman)  
# Load / Install Required Packages
p_load(dplyr, tidyr, gridExtra, psych)

在这种情况下,要加载/安装 dplyrtidyrgridExtrapsych
此包中还有一个很好的功能(如果您想清理环境)p_unload。
# Unload All packages
p_unload()

library(pkg, character.only = T) 结束了 if/else 的两个分支。为什么不把它放在 if/else 之外呢? - Rui Barradas
没错,谢谢 :). 已经修复了! - SysRIP
1个回答

3

这里有一个选项

Pkgs <- c('caret','readxl')
lib <- .libPaths()[1]

i1 <- !(Pkgs %in% row.names(installed.packages()))
if(any(i1)) {
  install.packages(Pkgs[i1], dependencies = TRUE, lib = lib) 
  }

会尽快接受您的答案。感谢快速回复。请允许我提出一个简短的跟进问题,在您的代码片段中,如何在Pkgs中加载libs?我在这里找到了daroczig建议的lapply(x, require, character.only = TRUE) https://dev59.com/rWsz5IYBdhLWcg3wADIm - SysRIP
再次感谢,但是当我的同行(由于意外)已经有其中一个包时,它仍不会被加载(至少对于我的测试),因为if语句不会被执行。那么您是否建议使用lapply解决方案? - SysRIP
@SysRIP 是的,'i1' 检查软件包是否已经存在。不清楚您是否需要重新安装它。 - akrun
@SysRIP 你的意思是要避免安装其中一个软件包吗? - akrun
1
我现在已经掌握了最终的解决方案。我想提供给我的同事一个脚本,该脚本安装他尚未拥有的软件包,然后加载所有所需的软件包。这样,如果再次运行脚本,就不会再次安装所有软件包。非常感谢快速而富有成效的帮助。 - SysRIP
它不会再次安装,因为我们有检查。 - akrun

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