Вывод функции для проверки и установки отсутствующих пакетов

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

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


person KVemuri    schedule 11.10.2019    source источник


Ответы (2)


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

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

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

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

person KVemuri    schedule 15.10.2019

person    schedule
comment
Спасибо большое, у меня тоже была похожая функция. Затем я стал жадным и захотел загрузить уже установленные пакеты на том же этапе. Вышеупомянутая функция работает отлично, когда у меня нет в ней библиотечного шага. Я хотел знать, почему происходит вывод, который я показал выше. Не то чтобы это неправильно, просто неожиданно и немного ненужно. Дайте мне знать, если у вас есть какие-либо мысли по этому поводу. - person KVemuri; 12.10.2019