Une manière élégante de vérifier les paquets manquants et de les installer?

337

Il semble que je partage beaucoup de code avec les co-auteurs ces jours-ci. Beaucoup d'entre eux sont des utilisateurs R novices / intermédiaires et ne réalisent pas qu'ils doivent installer des packages qu'ils n'ont pas déjà.

Existe-t-il un moyen élégant d'appeler installed.packages(), de comparer cela à ceux que je charge et d'installer s'il manque?

Maiasaura
la source
1
@krlmlr Qu'en est-il de la réponse acceptée qui est obsolète et doit être révisée? Cela fonctionne pour moi (pour quelques tests rapides) sous R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit).
Brian Diggs
1
@BrianDiggs: Au moins trois packages sont apparus pour résoudre ce problème, un seul est référencé ci-dessous. Y a-t-il encore plus - telle est la question.
krlmlr
2
@krlmlr Il semble y avoir un petit problème ironique de poulet et d'œuf concernant l'utilisation d'un paquet pour s'assurer que (d'autres) ont les paquets nécessaires. Mais cela vaut certainement la peine de demander à quelqu'un qui les connaît de rédiger une réponse.
Brian Diggs
2
@BrianDiggs: L'amorçage de ce package de vérification d'installation est une nuisance nécessaire, mais petite. À moins, bien sûr, que la fonctionnalité ne trouve son chemin dans base... ;-)
krlmlr

Réponses:

304

Oui. Si vous avez votre liste de packages, comparez-la à la sortie de installed.packages()[,"Package"]et installez les packages manquants. Quelque chose comme ça:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Autrement:

Si vous placez votre code dans un package et en faites des dépendances, ils seront automatiquement installés lorsque vous installerez votre package.

Shane
la source
11
Je pense que la syntaxe appropriée est: if(length(new.packages)>0) {install.packages(new.packages)}
5
@psql, Shine a raison, car "> 0" est "implicite" dans la condition if. exécutez ceci pour le vérifier:new.packages <- c(1,2) length(new.packages) if(length(new.packages)){print("hello!")}else{print("oh no!")}
Andrea Cirillo
7
Le document de installed.packages déclare: "Cela peut être lent lorsque des milliers de packages sont installés, alors ne l'utilisez pas pour savoir si un package nommé est installé (utilisez system.file ou find.package) ..."
Thomas Materna
2
D'accord avec Thomas, ce serait une meilleure performance avec requireau lieu de vérifierinstalled.packages
Matthew
1
packrata été fait pour cela. Il s'agit d'un système de gestion de paquets reproductible. Cette façon de procéder va dans le mauvais sens et perturbe l'environnement de quelqu'un d'autre et n'est pas reproductible. Packrat possède son propre dossier et environnement pour les bibliothèques partagées. rstudio.github.io/packrat
mtelesha
231

Dason K. et moi avons le paquet pacman qui peut très bien faire ça. La fonction p_loaddu package fait cela. La première ligne consiste simplement à s'assurer que pacman est installé.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)
Tyler Rinker
la source
1
Quel est le statut du colis? Je ne peux pas voir C-RAN.
MERose
4
@MERose pacman est maintenant sur CRAN cran.r-project.org/web/packages/pacman/index.html
Tyler Rinker
6
J'ai installé maintenant et fonctionne à merveille; devrait faire partie de la base!
AndyF
3
La seule façon d'améliorer cela serait de vérifier /et, s'il est trouvé, d'installer / charger automatiquement à partir de github.
frappe aérienne le
4
@NealBarsch si vous voulez dire if (!require("pacman")) install.packages("pacman")qu'il y a une fonction appelée dans pacman p_boot()qui crée automatiquement cette ligne pour vous et la copie dans le presse-papiers.
Tyler Rinker
72

Vous pouvez simplement utiliser la valeur de retour de require:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}

J'utilise libraryaprès l'installation car cela lèvera une exception si l'installation n'a pas réussi ou si le package ne peut pas être chargé pour une autre raison. Vous rendez cela plus robuste et réutilisable:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

L'inconvénient de cette méthode est que vous devez passer le nom du package entre guillemets, ce que vous ne faites pas pour le vrai require.

Livius
la source
4
Vous pouvez beaucoup simplifier votre vie en utilisant character.only = TRUEin require, mais je suppose qu'il n'y a rien pour différencier votre réponse de la mienne.
Simon O'Hanlon,
Cela a l'air bien, mais cela ne semble pas fonctionner, du moins pour moi. Lorsque j'ai essayé la version robuste de cela, j'obtiens deux messages d'erreur car R ne sait pas comment gérer "return True" et "return eval" pour une raison quelconque. Je voudrais donc vraiment une fonction comme celle-ci qui charge un package s'il est présent dans ma bibliothèque et installe (et charge ensuite) le package. Idéalement, j'utiliserais cela par défaut pour charger des packages. Au moins, il semble que cela aurait du sens et permettrait de gagner du temps.
Fabian Habersack
23
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')

"ggplot2" est le paquet. Il vérifie si le package est installé, sinon, il l'installe. Il charge ensuite le package quelle que soit la branche qu'il a prise.

user6784955
la source
21

Cette solution prendra un vecteur de caractères des noms de packages et tentera de les charger ou de les installer si le chargement échoue. Cela dépend du comportement de retour de requirepour ce faire car ...

require renvoie (de manière invisible) une logique indiquant si le package requis est disponible

Par conséquent, nous pouvons simplement voir si nous avons pu charger le package requis et sinon, l'installer avec les dépendances. Donc, étant donné un vecteur de caractères des packages que vous souhaitez charger ...

foo <- function(x){
  for( i in x ){
    #  require returns TRUE invisibly if it was able to load package
    if( ! require( i , character.only = TRUE ) ){
      #  If package was not able to be loaded then re-install
      install.packages( i , dependencies = TRUE )
      #  Load package after installing
      require( i , character.only = TRUE )
    }
  }
}

#  Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )
Simon O'Hanlon
la source
Souhaitez-vous pas appeler à requirenouveau après l'installation?
krlmlr
@krlmlr Non, car pour que l' ifinstruction soit évaluée, elle doit d'abord évaluer require, dont l'effet secondaire est de charger le package s'il est disponible!
Simon O'Hanlon
1
SimonO101: Je pense que krlmlr signifie dans l'instruction if, après l'appel à install.packages, car cela ne chargerait pas réellement ce paquet. Mais (à @krlmlr) je soupçonne que l'intention est que ce fragment de code ne soit appelé qu'une seule fois; vous ne l'écririez pas à chaque fois que vous auriez besoin du package. Au lieu de cela, vous l'exécutez une fois à l'avance, puis appelez requirecomme d'habitude selon vos besoins.
Aaron a quitté Stack Overflow
@Aaron ah oui ok, je vois ce que tu veux dire, et oui ton interprétation est correcte. Je vais le modifier légèrement pour être plus explicite sur le chargement après l'installation.
Simon O'Hanlon
1
ne vaudrait-il pas mieux requireappeler le second librarypour qu'il échoue bruyamment s'il n'est toujours pas en mesure de joindre le paquet pour une raison quelconque?
kabdulla
18

Beaucoup de réponses ci-dessus (et sur des doublons de cette question) se fondent sur la installed.packagesmauvaise forme. De la documentation:

Cela peut être lent lorsque des milliers de packages sont installés, donc ne l'utilisez pas pour savoir si un package nommé est installé (utilisez system.file ou find.package) ni pour savoir si un package est utilisable (appelez require et vérifiez le valeur de retour) ni pour trouver les détails d'un petit nombre de packages (utilisez packageDescription). Il doit lire plusieurs fichiers par package installé, ce qui sera lent sous Windows et sur certains systèmes de fichiers montés en réseau.

Ainsi, une meilleure approche consiste à tenter de charger le package à l'aide de requireet à installer si le chargement échoue ( requireretournera FALSEs'il n'est pas trouvé). Je préfère cette implémentation:

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    if(length(need)>0){ 
        install.packages(need)
        lapply(need,require,character.only=TRUE)
    }
}

qui peut être utilisé comme ceci:

using("RCurl","ggplot2","jsonlite","magrittr")

De cette façon, il charge tous les packages, puis revient en arrière et installe tous les packages manquants (ce qui si vous le souhaitez, est un endroit pratique pour insérer une invite pour demander si l'utilisateur souhaite installer des packages). Au lieu d'appeler install.packagesséparément pour chaque paquet, il passe le vecteur entier des paquets désinstallés une seule fois.

Voici la même fonction mais avec une boîte de dialogue Windows qui demande si l'utilisateur souhaite installer les packages manquants

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    n<-length(need)
    if(n>0){
        libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
        print(libsmsg)
        if(n>1){
            libsmsg<-paste(libsmsg," and ", need[n],sep="")
        }
        libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
        if(winDialog(type = c("yesno"), libsmsg)=="YES"){       
            install.packages(need)
            lapply(need,require,character.only=TRUE)
        }
    }
}
Matthieu
la source
C'est une manière assez élégante, bien meilleure que celle acceptée. Je vais l'inclure dans ma bibliothèque personnelle. Merci.
Bing
15

Bien que la réponse de Shane soit vraiment bonne, pour l'un de mes projets, j'avais besoin de supprimer les messages de sortie, les avertissements et d'installer les packages automatiquement . J'ai finalement réussi à obtenir ce script:

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

Utilisation:

libraries <- c("ReadImages", "ggplot2")
for(library in libraries) 
{ 
    if(!UsePackage(library))
    {
        stop("Error!", library)
    }
}
Juan Antonio Cano
la source
9
# List of packages for session
.packages = c("ggplot2", "plyr", "rms")

# Install CRAN packages (if not already installed)
.inst <- .packages %in% installed.packages()
if(length(.packages[!.inst]) > 0) install.packages(.packages[!.inst])

# Load packages into session 
lapply(.packages, require, character.only=TRUE)
Brian Spiering
la source
6

C'est le but du package rbundler : fournir un moyen de contrôler les packages installés pour un projet spécifique. À l'heure actuelle, le package fonctionne avec la fonctionnalité devtools pour installer les packages dans le répertoire de votre projet. La fonctionnalité est similaire au bundler de Ruby .

Si votre projet est un package (recommandé), il vous suffit de charger rbundler et de regrouper les packages. La bundlefonction examinera le DESCRIPTIONfichier de votre package pour déterminer les packages à regrouper.

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

Maintenant, les packages seront installés dans le répertoire .Rbundle.

Si votre projet n'est pas un package, vous pouvez le simuler en créant un DESCRIPTIONfichier dans le répertoire racine de votre projet avec un champ Depends qui répertorie les packages que vous souhaitez installer (avec des informations de version facultatives):

Depends: ggplot2 (>= 0.9.2), arm, glmnet

Voici le dépôt github du projet si vous êtes intéressé à contribuer: rbundler .

Erik Shilts
la source
5

Sûr.

Vous devez comparer les «packages installés» avec les «packages souhaités». C'est très proche de ce que je fais avec CRANberries car j'ai besoin de comparer les «packages connus stockés» avec les «packages actuellement connus» pour déterminer les packages nouveaux et / ou mis à jour.

Alors fais quelque chose comme

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

pour obtenir tous les packages connus, appelez simulairement les packages actuellement installés et comparez cela à un ensemble donné de packages cibles.

Dirk Eddelbuettel
la source
5

À utiliser packratpour que les bibliothèques partagées soient exactement les mêmes et ne changent pas l'environnement des autres.

En termes d'élégance et de meilleures pratiques, je pense que vous vous y prenez fondamentalement dans le mauvais sens. Le package a packratété conçu pour ces problèmes. Il est développé par RStudio par Hadley Wickham. Au lieu de devoir installer des dépendances et éventuellement gâcher le système d'environnement de quelqu'un, packratutilise son propre répertoire et installe toutes les dépendances pour vos programmes là-dedans et ne touche pas l'environnement de quelqu'un.

Packrat est un système de gestion des dépendances pour R.

Les dépendances du package R peuvent être frustrantes. Avez-vous déjà dû utiliser des essais et des erreurs pour déterminer les packages R que vous devez installer pour faire fonctionner le code de quelqu'un d'autre, puis vous êtes resté avec ces packages installés globalement pour toujours, car maintenant vous ne savez pas si vous en avez besoin ? Avez-vous déjà mis à jour un package pour que le code de l'un de vos projets fonctionne, pour constater que le package mis à jour fait que le code d'un autre projet cesse de fonctionner?

Nous avons construit packrat pour résoudre ces problèmes. Utilisez packrat pour rendre vos projets R plus:

  • Isolé: l'installation d'un package nouveau ou mis à jour pour un projet n'interrompra pas vos autres projets, et vice versa. En effet, packrat donne à chaque projet sa propre bibliothèque de packages privés.
  • Portable: transportez facilement vos projets d'un ordinateur à un autre, même sur différentes plates-formes. Packrat facilite l'installation des packages dont dépend votre projet.
  • Reproductible: Packrat enregistre les versions exactes des packages dont vous dépendez et garantit que ces versions exactes sont celles qui sont installées où que vous alliez.

https://rstudio.github.io/packrat/

mtelesha
la source
4

La fonction simple suivante fonctionne comme un charme:

  usePackage<-function(p){
      # load a package if installed, else load after installation.
      # Args:
      #   p: package name in quotes

      if (!is.element(p, installed.packages()[,1])){
        print(paste('Package:',p,'Not found, Installing Now...'))
        install.packages(p, dep = TRUE)}
      print(paste('Loading Package :',p))
      require(p, character.only = TRUE)  
    }

(pas le mien, je l'ai trouvé sur le Web il y a quelque temps et je l'ai utilisé depuis. Je ne suis pas sûr de la source d'origine)

Anish Sugathan
la source
4

J'utilise la fonction suivante pour installer le package en cas de require("<package>")sortie avec une erreur de package introuvable. Il interrogera les deux référentiels CRAN et Bioconductor pour le paquet manquant.

Adapté de l'œuvre originale de Joshua Wiley, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    #update.packages(ask= FALSE) #update installed packages.
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
  }
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    #biocLite(character(), ask=FALSE) #update installed packages.
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

Exemple:

install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN

PS: update.packages(ask = FALSE)& biocLite(character(), ask=FALSE)mettra à jour tous les packages installés sur le système. Cela peut prendre du temps et le considérer comme une mise à niveau R complète qui peut ne pas être garantie tout le temps!

Samir
la source
Il pourrait être amélioré en vérifiant si les packages sont réellement disponibles sur cran ou bc. Il doit également utiliser la bibliothèque à la fin pour générer une erreur si l'installation a échoué ou si un package n'existe pas. Voir ma version améliorée appelée loadpack()sur raw.githubusercontent.com/holgerbrandl/datautils/master/R/…
Holger Brandl
4

Vous pouvez simplement utiliser la setdifffonction pour obtenir les packages qui ne sont pas installés, puis les installer. Dans l'exemple ci-dessous, nous vérifions si les packages ggplot2et Rcppsont installés avant de les installer.

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

En une ligne, ce qui précède peut s'écrire:

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))
Alex Essilfie
la source
J'utilise la même approche. Nous pouvons également utiliser installed.packages()[,'Package']au lieu de rownames(installed.packages()).
Scudelletti
3

J'ai implémenté la fonction pour installer et charger silencieusement les packages R requis. L'espoir pourrait aider. Voici le code:

# 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);
Pratik Patil
la source
3

La prochaine version de RStudio (1.2), déjà disponible en avant-première, comprendra une fonctionnalité pour détecter les paquets manquants library()et les require()appels, et invitera l'utilisateur à les installer:

Détecter les packages R manquants

De nombreux scripts R s'ouvrent avec des appels à library()et require()pour charger les packages dont ils ont besoin pour s'exécuter. Si vous ouvrez un script R qui fait référence à des packages que vous n'avez pas installés, RStudio propose désormais d'installer tous les packages nécessaires en un seul clic. Plus besoin de taper à install.packages()plusieurs reprises jusqu'à ce que les erreurs disparaissent!
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

Cela semble répondre particulièrement bien à la préoccupation initiale du PO:

Beaucoup d'entre eux sont des utilisateurs R novices / intermédiaires et ne réalisent pas qu'ils doivent installer des packages qu'ils n'ont pas déjà.

Aurèle
la source
2

Concernant votre objectif principal "installer des bibliothèques qu'ils n'ont pas déjà." Et indépendamment de l'utilisation de "instllaed.packages ()". La fonction suivante masque la fonction d'origine de require. Il essaie de charger et de vérifier le package nommé "x", s'il n'est pas installé, installez-le directement, y compris les dépendances; et enfin le charger normalement. vous renommez le nom de la fonction de 'require' en 'library' pour maintenir l'intégrité. La seule limitation est que les noms des packages doivent être cités.

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

Vous pouvez donc charger et installer le package à l'ancienne façon de R. require ("ggplot2") require ("Rcpp")

GeoObserver
la source
Si vous n'aimez plus votre réponse, ne la vandalisez pas - supprimez-la simplement.
Michael Petrotta
Eh bien, j'ai essayé, mais je n'ai pas pu. Je pense que mon extension NoScript de FF la désactive ou je n'ai pas les droits et crédits pour supprimer ma propre réponse. LoL Cependant, je pense que Livius est assez proche de ma réponse, pensé sans masquer. Merci Michael Petrotta. pour la notification.
GeoObserver
Vous devriez voir un deletelien au-dessus de ces commentaires. Si vous ne le faites pas et que vous souhaitez toujours le supprimer, utilisez le flaglien, sélectionnez "autre" et expliquez à un modérateur que vous souhaitez que la réponse soit supprimée.
Michael Petrotta
2

Assez basique.

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)
jangorecki
la source
2

Je pensais contribuer celui que j'utilise:

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")
Ben
la source
2
source("https://bioconductor.org/biocLite.R")
if (!require("ggsci")) biocLite("ggsci")
Shicheng Guo
la source
2

En utilisant l'approche familiale paresseuse et la fonction anonyme, vous pouvez:

  1. Essayez de joindre tous les packages répertoriés.
  2. Installation manquante uniquement (utilisation || évaluation paresseuse).
  3. Essayez de rattacher ceux qui manquaient à l'étape 1 et installés à l'étape 2.
  4. Imprimez le statut de chargement final de chaque colis ( TRUE/ FALSE).

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE 
Georgie Shimanovsky
la source
1

J'utilise ce qui suit qui vérifiera si le package est installé et si les dépendances sont mises à jour, puis charge le package.

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}
metasequoia
la source
1

Voici mon code pour cela:

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)
Edward Tyler
la source
1
 48 lapply_install_and_load <- function (package1, ...)
 49 {
 50     #
 51     # convert arguments to vector
 52     #
 53     packages <- c(package1, ...)
 54     #
 55     # check if loaded and installed
 56     #
 57     loaded        <- packages %in% (.packages())
 58     names(loaded) <- packages
 59     #
 60     installed        <- packages %in% rownames(installed.packages())
 61     names(installed) <- packages
 62     #
 63     # start loop to determine if each package is installed
 64     #
 65     load_it <- function (p, loaded, installed)
 66     {
 67         if (loaded[p])
 68         {
 69             print(paste(p, "loaded"))
 70         }
 71         else
 72         {
 73             print(paste(p, "not loaded"))
 74             if (installed[p])
 75             {
 76                 print(paste(p, "installed"))
 77                 do.call("library", list(p))
 78             }
 79             else
 80             {
 81                 print(paste(p, "not installed"))
 82                 install.packages(p)
 83                 do.call("library", list(p))
 84             }
 85         }
 86     }
 87     #
 88     lapply(packages, load_it, loaded, installed)
 89 }
ruemorgue
la source
1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

Cela fonctionne avec les noms de paquets non cités et est assez élégant (cf. la réponse de GeoObserver)

sn
la source
1

Dans mon cas, je voulais une doublure que je pourrais exécuter à partir de la ligne de commande (en fait via un Makefile). Voici un exemple d'installation de "VGAM" et "feather" s'ils ne sont pas déjà installés:

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

De l'intérieur de R, ce serait juste:

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

Il n'y a rien ici au-delà des solutions précédentes, sauf que:

  • Je le garde sur une seule ligne
  • J'ai codé en dur le reposparamètre (pour éviter toute fenêtre contextuelle demandant le miroir à utiliser)
  • Je n'ai pas la peine de définir une fonction à utiliser ailleurs

Notez également l'important character.only=TRUE(sans lui, le requiretenterait de charger le package p).

user3780389
la source
0
  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)
}
KVemuri
la source
0

Permettez-moi de partager un peu de folie:

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
lf_araujo
la source