【问题标题】:Elegant way to load a string list of packages in R在 R 中加载包的字符串列表的优雅方式
【发布时间】:2020-01-05 17:15:34
【问题描述】:

您好,我编写了以下代码:

################# 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 仍然会发出警告消息: 警告信息:

在库中(包,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 - 包对这个目的非常有用,尤其是 p_load function。它会检查包是否已安装,否则会尝试安装丢失的包。

这个函数是库和需求的包装器。它检查以查看 如果安装了一个包,如果没有,它会尝试安装这个包 来自 CRAN 和/或 pacman 存储库列表中的任何其他存储库。

所以现在我用以下几行开始我所有需要“便携”的脚本:

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

在这种情况下加载/安装dplyrtidyrgridExtra & psych

这个包也不错(如果要清理环境的话)p_unload

# Unload All packages
p_unload()

【问题讨论】:

  • library(pkg, character.only = T) 结束 if/else 的两个分支。为什么不把它放在外面,在if/else之后?
  • 你说得对,你 :)。修好了!

标签: r package


【解决方案1】:

这是一种选择

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

【讨论】:

  • 将尽快接受您的回答。 Ty 用于快速响应。请允许我提出一个简短的后续问题,在您的剪辑中如何将库加载到 Pkgs 中?我发现了这个lapply(x, require, character.only = TRUE) daroczig 在这里建议stackoverflow.com/questions/8175912/…
  • 再次感谢,但是当我的同行(偶然)已经拥有其中一个包时,它仍然不会被加载(至少对于我的测试而言),因为 if 不会运行。然后你会建议 lapply 解决方案吗?
  • @SysRIP 是的,'i1' 检查包是否已经存在。不清楚是否需要重新安装
  • @SysRIP 您的意思是要避免安装其中一个软件包吗?
  • 我现在对最终解决方案很满意。我想为我的同事提供一个脚本,它可以安装他还没有的软件包,然后加载所有需要的软件包。因此,如果脚本第二次运行,则不会不必要地再次安装所有软件包。非常感谢您快速而富有成效的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2012-11-09
相关资源
最近更新 更多