检查并安装缺失包的函数输出

Output of function to check for and install missing packages

对文字墙深表歉意。

基于这个post and this post,主要是,我写了一个函数让我在每个R脚本的开头安装一个包列表,而不必经历每个"Call function -> get error message -> install package"的循环时间。函数是这样的:

`packages_installed <- function(pkg_list){
        pkgs <- unlist(pkg_list)
        req <- unlist(lapply(pkgs, require, character.only = TRUE))
        not_installed <- pkgs[req == FALSE]
        lapply(not_installed, install.packages, 
               repos = "http://cran.r-project.org")#also add lib.loc later
        lapply(pkgs, library, character.only = TRUE)
`

但是,当我尝试 运行 时,输出是已安装包的列表。例如,这是我的试用 运行:

```package_list <- c("dagitty","MMWRweek","ggplot2","parallel")```
```packages_installed(package_list)```

这是我的输出:

```
[[1]]
 [1] "dagitty"       "parallel"      "CoxBoost"      "prodlim"      
 [5] "Matrix"        "survival"      "spatstat"      "rpart"        
 [9] "nlme"          "spatstat.data" "ggmap"         "leaflet"      
[13] "spdep"         "spData"        "sp"            "pdftools"     
[17] "data.table"    "forcats"       "stringr"       "dplyr"        
[21] "purrr"         "readr"         "tidyr"         "tibble"       
[25] "tidyverse"     "ggplot2"       "sf"            "RJSONIO"      
[29] "stats"         "graphics"      "grDevices"     "utils"        
[33] "datasets"      "methods"       "base"         

[[2]]
 [1] "MMWRweek"      "dagitty"       "parallel"      "CoxBoost"     
 [5] "prodlim"       "Matrix"        "survival"      "spatstat"     
 [9] "rpart"         "nlme"          "spatstat.data" "ggmap"        
[13] "leaflet"       "spdep"         "spData"        "sp"           
[17] "pdftools"      "data.table"    "forcats"       "stringr"      
[21] "dplyr"         "purrr"         "readr"         "tidyr"        
[25] "tibble"        "tidyverse"     "ggplot2"       "sf"           
[29] "RJSONIO"       "stats"         "graphics"      "grDevices"    
[33] "utils"         "datasets"      "methods"       "base"         

[[3]]
 [1] "MMWRweek"      "dagitty"       "parallel"      "CoxBoost"     
 [5] "prodlim"       "Matrix"        "survival"      "spatstat"     
 [9] "rpart"         "nlme"          "spatstat.data" "ggmap"        
[13] "leaflet"       "spdep"         "spData"        "sp"           
[17] "pdftools"      "data.table"    "forcats"       "stringr"      
[21] "dplyr"         "purrr"         "readr"         "tidyr"        
[25] "tibble"        "tidyverse"     "ggplot2"       "sf"           
[29] "RJSONIO"       "stats"         "graphics"      "grDevices"    
[33] "utils"         "datasets"      "methods"       "base"         

[[4]]
 [1] "MMWRweek"      "dagitty"       "parallel"      "CoxBoost"     
 [5] "prodlim"       "Matrix"        "survival"      "spatstat"     
 [9] "rpart"         "nlme"          "spatstat.data" "ggmap"        
[13] "leaflet"       "spdep"         "spData"        "sp"           
[17] "pdftools"      "data.table"    "forcats"       "stringr"      
[21] "dplyr"         "purrr"         "readr"         "tidyr"        
[25] "tibble"        "tidyverse"     "ggplot2"       "sf"           
[29] "RJSONIO"       "stats"         "graphics"      "grDevices"    
[33] "utils"         "datasets"      "methods"       "base"         

Warning messages:
1: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called ‘dagitty’
2: In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called ‘MMWRweek’
```

我理解警告消息,它们是函数中 require 调用的输出。这是我每次调用该函数时的输出,即使已经安装并加载了包。据我所知,这些是全局环境中的包,我不清楚如何防止它们出现。感谢任何帮助。

necessary_packages <- c("DBI", "odbc")

new_packages <- necessary_packages[!(necessary_packages %in% installed.packages()[,"Package"])]

if(seq_along(new_packages) > 0){install.packages(new_packages, dependencies = TRUE)}

lapply(necessary_packages, require, character.only = TRUE)

朋友帮我在library函数的文档中找到了答案,我应该在提问之前仔细阅读一下:

"Normally library returns (invisibly) the list of attached packages, but TRUE or FALSE if logical.return is TRUE. When called as library() it returns an object of class "libraryIQR",对于库 (help=),class "packageInfo" 之一。"

相应地,我修改了我的功能,只return不管它是否已经加载。

packages_installed <- function(pkg_list){
    pkgs <- unlist(pkg_list)
    req <- unlist(lapply(pkgs, require, character.only = TRUE, 
                         quietly = TRUE))
    not_installed <- pkgs[req == FALSE]
    lapply(not_installed, install.packages, 
           repos = "http://cran.r-project.org")#also add lib.loc later
    sapply(pkgs, library, character.only = TRUE, 
           logical.return = TRUE, warn.conflicts = TRUE)

}

现在参数的输出 package_list

package_list <- list("rNOMADS","adehabitatMA","raster","rgdal","rgeos"); packages_installed(package_list)

读作

rNOMADS adehabitatMA raster rgdal rgeos TRUE TRUE TRUE TRUE TRUE