在运行install.packages()之前检查已安装的软件包

Wal*_*cio 128 packages r

我有一个R脚本,与不同计算机上的多个用户共享.其中一行包含install.packages("xtable")命令.

问题是,每次有人运行脚本时,R都会花费大量时间显然重新安装软件包(实际上确实需要一些时间,因为实际案例中有几个软件包的向量).

如何首先检查软件包是否已安装,然后仅install.packages()针对那些软件包运行?

小智 142

尝试:require("xtable")"xtable" %in% rownames(installed.packages())

  • 所以`if("xtable"%in%rownames(installed.packages())== FALSE){install.packages("xtable")}` (35认同)
  • 我在`if(!pacote%in installed installed.packages())install.packages(pacote)`中创建了一个函数.这很好又优雅,谢谢! (7认同)
  • 竖起大拇指“packagename %in% rownames(installed.packages())”!`require` 的问题是,如果可能的话它会自动加载包。有时这是不希望的。我使用包 `tidyverse`(`dplyr`) 和 `signal` - 都有一个函数 `filter`。由于我更频繁地使用 `dplyr::filter` 方式,我想要一种方法来检查 `signal` 是否已安装但不加载它。 (2认同)

Sac*_*amp 48

这是我经常用来检查包的函数,否则安装它并再次加载:

pkgTest <- function(x)
  {
    if (!require(x,character.only = TRUE))
    {
      install.packages(x,dep=TRUE)
        if(!require(x,character.only = TRUE)) stop("Package not found")
    }
  }
Run Code Online (Sandbox Code Playgroud)

pkgTest("xtable").它仅在镜像设置时有效,但您可以在require调用中输入该镜像.


Sea*_*phy 48

如果您想尽可能简单地做到:

packages <- c("ggplot2", "dplyr", "Hmisc", "lme4", "arm", "lattice", "lavaan")
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
  install.packages(setdiff(packages, rownames(installed.packages())))  
}
Run Code Online (Sandbox Code Playgroud)

将第一行中列出的包替换为运行代码所需的包,并vo!

  • 在 R 3.6.2 中,您不需要“if”部分。只需 `install.packages(setdiff(packages, rownames(installed.packages())))` 就足够了。(如果所有包都已安装,“setdiff”将返回“character(0)”,这会导致“install.packages()”不执行任何操作。) (3认同)
  • 我喜欢这种方法。当所有的packages包都已经安装时,这是一种可耻的行为。 (2认同)

Nic*_*edy 14

还有CRAN包pacman,它具有p_load安装一个或多个包的功能(但仅在必要时),然后加载它们.


Art*_*sov 12

我建议使用更轻量级的解决方案system.file.

is_inst <- function(pkg) {
    nzchar(system.file(package = pkg))
}

is_inst2 <- function(pkg) {
    pkg %in% rownames(installed.packages())
}

library(microbenchmark)
microbenchmark(is_inst("aaa"), is_inst2("aaa"))
## Unit: microseconds
##            expr      min        lq       mean    median       uq       max neval
##  is_inst("aaa")   22.284   24.6335   42.84806   34.6815   47.566   252.568   100
## is_inst2("aaa") 1099.334 1220.5510 1778.57019 1401.5095 1829.973 17653.148   100
microbenchmark(is_inst("ggplot2"), is_inst2("ggplot2"))
## Unit: microseconds
##                expr      min       lq     mean   median       uq      max neval
##  is_inst("ggplot2")  336.845  386.660  459.243  431.710  483.474  867.637   100
## is_inst2("ggplot2") 1144.613 1276.847 1507.355 1410.054 1656.557 2747.508   100
Run Code Online (Sandbox Code Playgroud)

  • 这样一个被低估的答案。`installed.packages()` 慢得多。谢谢你! (3认同)
  • 在幕后,`system.file`正在使用另一个`base`函数:`find.package`,这会更直接(注意:如果包不存在,需要`quiet=TRUE`来防止错误) (2认同)
  • 我在[此处](/sf/answers/4396644311/)对此进行了更多扩展,因为这个问题已关闭 (2认同)

Nic*_*ton 10

requiredPackages = c('plyr','ggplot2','ggtern')
for(p in requiredPackages){
  if(!require(p,character.only = TRUE)) install.packages(p)
  library(p,character.only = TRUE)
}
Run Code Online (Sandbox Code Playgroud)


Duc*_*ran 9

# Function to check whether package is installed
  is.installed <- function(mypkg){
    is.element(mypkg, installed.packages()[,1])
  } 

  # check if package "hydroGOF" is installed
  if (!is.installed("hydroGOF")){
    install.packages("hydroGOF")
  }
Run Code Online (Sandbox Code Playgroud)


Cou*_*ine 6

我在packages某个地方找到了一个脚本,我总是在每个脚本中加载我的库.它将完成您的所有库处理(下载,安装和加载),并且仅在需要时执行.

# Install function for packages    
packages<-function(x){
  x<-as.character(match.call()[[2]])
  if (!require(x,character.only=TRUE)){
    install.packages(pkgs=x,repos="http://cran.r-project.org")
    require(x,character.only=TRUE)
  }
}
packages(ggplot2)
packages(reshape2)
packages(plyr)
# etc etc
Run Code Online (Sandbox Code Playgroud)


Pra*_*til 5

我已经实现了静默安装和加载所需 R 包的功能。希望可能会有所帮助。这是代码:

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);
Run Code Online (Sandbox Code Playgroud)