Элегантный способ проверить отсутствующие пакеты и установить их?

Кажется, я делюсь большим количеством кода с соавторами в эти дни. Многие из них являются начинающими / промежуточными пользователями R и не понимают, что им нужно устанавливать пакеты, которых у них еще нет.

Есть ли элегантный способ позвонить installed.packages(), сравните это с теми, которые я загружаю и устанавливаю, если отсутствует?

36 ответов

В моем случае я хотел один лайнер, который я мог запустить из командной строки (на самом деле через Makefile). Вот пример установки "VGAM" и "Перо", если они еще не установлены:

R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'

Изнутри R это будет просто:

for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")

Здесь нет ничего кроме предыдущих решений, кроме того, что:

  • Я держу это в одной строке
  • Я жестко закодировал repos параметр (чтобы избежать всплывающих окон, спрашивающих об использовании зеркала)
  • Я не пытаюсь определить функцию, которая будет использоваться в другом месте

Также обратите внимание на важные character.only=TRUE (без этого require попытался бы загрузить пакет p).

library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

Это работает с именами пакетов без кавычек и довольно элегантно (см. Ответ GeoObserver)

      pckg=c("shiny","ggplot2","dplyr","leaflet","lubridate","RColorBrewer","plotly","DT","shinythemes")

for(i in 1:length(pckg)) 
   {
      print(pckg[i])
      if (!is.element(pckg[i], installed.packages()[,1]))
      install.packages(pckg[i], dep = TRUE)
      require(pckg[i], character.only = TRUE)
}

Стоя на плечах @MichaelChirico:

      stopifnot(3 == length(find.package(c('foo', 'bar', 'baz'))))
  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")# add lib.loc if needed
        lapply(pkgs, library, character.only = TRUE)
}

Попробуй это:

if (!require(MyDesiredLibrary)) {
   install.packages("MyDesiredLibrary")
}
Другие вопросы по тегам