394 votes

Élégant chemin à vérifier pour les paquets manquants et les installer ?

J’ai semblent partager beaucoup de code avec les coauteurs ces jours-ci. Beaucoup d'entre eux sont novice/intermédiaire utilisateurs R et ne réalisent pas qu’ils doivent installer des paquets, qu'ils n’ont pas déjà.

Y a-t-il une façon élégante d’appeler `` , comparer qu’à celles je suis charger et installer s’il manque ?

354voto

Shane Points 40885

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 mettez votre code dans un paquet et en faites des dépendances, il sera automatiquement installé lors de l'installation de votre paquet.

258voto

Tyler Rinker Points 27607

Dason K. et moi avons un paquet en préparation sur GitHub qui nécessite quelques tests et un peu de nettoyage et qui sera éventuellement poussé vers CRAN. La fonction p_load du package remplit cette fonction.

 library(devtools)
install_github("pacman", "trinker")
 

76voto

Livius Points 1272

[Cette réponse] est bon, mais inutilement compliqué. Vous pouvez simplement utiliser la valeur de retour de l' require:

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

J'utilise library après l'installation, car il va lever une exception si l'installation n'a pas réussi ou que le paquet ne peut pas être chargé pour une autre raison. Vous rendre plus robustes et réutilisables:

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 dans le devis, ce qui vous ne le faites pas pour le réel require.

16voto

Juan Antonio Cano Points 143

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 paquets 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)
    }
}
 

7voto

Erik Shilts Points 1763

C'est le but de la rbundler package: fournir un moyen de contrôler les paquets qui sont installés pour un projet spécifique. Droit maintenant le logiciel fonctionne avec les devtools fonctionnalités à installer les packages dans le dossier de votre projet. La fonctionnalité est similaire à Ruby bundler.

Si votre projet est un package (recommandé), puis tout ce que vous avez à faire est de charger rbundler et de regrouper les paquets. L' bundle fonction à regarder vos colis DESCRIPTION dossier afin de déterminer quels paquets bundle.

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

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

Si votre projet n'est pas un paquet, vous pouvez faire semblant par la création d'un DESCRIPTION le fichier dans votre répertoire racine avec un champ Depends que la liste des paquets que vous voulez installer (avec, en option, les informations de version):

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X