Вывод функции для проверки и установки отсутствующих пакетов - PullRequest
0 голосов
/ 11 октября 2019

Извинения за стену текста.

Основываясь на этом сообщении и этом сообщении , в первую очередь я написал функцию, позволяющую мне устанавливать список пакетовв начале каждого R-скрипта, без необходимости каждый раз проходить цикл «Вызов функции -> получить сообщение об ошибке -> установить пакет». Функция такова:

`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 вфункция. Это вывод каждый раз, когда я вызываю функцию, даже если пакет уже установлен и загружен. Насколько я могу судить, это пакеты в глобальной среде, и мне неясно, как предотвратить их появление. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Друг помог мне найти ответ в документации по функции library, которую я должен был прочитать более внимательно, прежде чем задавать вопрос:

"Обычно библиотека возвращает (невидимо) список прикрепленных пакетов, но TRUE или FALSE, если logic.return равен TRUE. При вызове library () возвращает объект класса "libraryIQR", а для библиотеки (help =) - один из класса "packageInfo". "

Соответственно, я изменил свою функцию, чтобы она возвращала только то, загружена она или нет.

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

0 голосов
/ 12 октября 2019
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)
...