Manière élégante de vérifier les paquets manquants et de les installer?
J'ai l'impression de partage de code avec des co-auteurs de ces jours. Beaucoup d'entre eux sont novice/intermédiaire R les utilisateurs et ne réalisent pas qu'ils ont pour installer des paquets, ils ne l'ont pas déjà.
Est-il une manière élégante d'appel installed.packages()
, de les comparer à ceux que je suis le chargement et l'installation en cas de disparition?
- Que dire de la accepté de répondre est obsolète et nécessite une révision? Il fonctionne pour moi (et pour quelques tests rapides) en vertu de
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
. - Au moins trois paquets sont apparus pour résoudre ce problème, un seul est mentionné ci-dessous. Est-il même plus-c'est la question.
- Il semble un peu ironique poulet et des œufs problème sur l'utilisation d'un paquet pour s'assurer (autres) ont des paquets nécessaires. Mais certainement la peine d'avoir quelqu'un qui sait écrire une réponse.
- L'amorçage de cette installation, de vérification de package est nécessaire est une nuisance, mais une petite. À moins, bien sûr, la fonctionnalité se retrouve dans
base
... 😉
Vous devez vous connecter pour publier un commentaire.
Oui. Si vous avez votre liste de paquets, de la comparer à la sortie de
installed.packages()[,"Package"]
et installer les paquets manquants. Quelque chose comme ceci:Autrement:
Si vous mettez votre code dans un paquet et de les rendre dépendances, alors il sera automatiquement installé lorsque vous installez le package.
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
au lieu de vérifierinstalled.packages
packrat
a été faite pour cela. C'est un reproductibles système de gestion de paquets. De cette façon est d'aller sur le mauvais chemin et mess avec quelqu'un d'autre de l'environnement et non reproductible. Packrat dispose de son propre dossier et de l'environnement pour les bibliothèques partagées. rstudio.github.io/packratpackrat
va être un gros gâchis si vous avez beaucoup de paquets dans votre projet.Dason K. et j'ai le pacman package qui peut faire cela très bien. La fonction
p_load
dans le colis n'a cette. La première ligne est juste pour s'assurer que pacman est installé./
et, le cas échéant, installer/charger à partir de github automatiquement.dep=TRUE
optionpacman
à la faute. Il semble que je suis le seul dans ce cas.if (!require("pacman")) install.packages("pacman")
il existe une fonction dans pacman appelép_boot()
que maks cette ligne pour vous automatiquement et le copie dans le presse-papiers.Vous pouvez simplement utiliser la valeur de retour de
require
:- Je utiliser
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: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 la vraie
require
.character.only = TRUE
dansrequire
, mais alors je suppose qu'il n'y a rien à se différencier de votre réponse de la mienne.eval
truc.Cette solution prendra un caractère de vecteur de noms de paquets et de tenter de les charger, ou de les installer si le chargement échoue. Il s'appuie sur le retour le comportement de
require
pour ce faire, parce que...Donc, on peut simplement voir si nous étions en mesure de charger le package requis et si non, de l'installer avec dépendances. Donc, étant donné un caractère de vecteur de paquets que vous voulez charger...
require
à nouveau après l'installation?if
déclaration afin d'être évalué, il faut d'abord évaluerrequire
, les effets secondaires de ce qui est le chargement du package si elle est disponible!install.packages
, que ce ne serait pas charger ce package. Mais (pour @krlmlr) je soupçonne que l'intention est que ce fragment de code ne serait appelé une seule fois; vous n'auriez pas écrit ce à chaque fois que vous avez exigé le paquet. Au lieu de cela, vous feriez exécuter une fois à l'avance, et ensuite appelerrequire
comme d'habitude, en tant que de besoin.R
fonction ne fonctionne pas lorsque vous exécutez le script à partir de lashell
?require
un appel àlibrary
de sorte qu'il ne parvient pas bruyamment, s'il est toujours impossible de joindre le paquet pour une raison quelconque?Bien que la réponse de Shane est vraiment bon, pour un de mes projet j'ai besoin de supprimer la sortie des messages, avertissements et installer des paquets automatiquement. J'ai enfin réussi à obtenir ce script:
Utilisation:
"ggplot2" est le package. Il vérifie pour voir si le paquet est installé, si ce n'est pas qu'il l'installe. Il charge alors le paquet indépendamment de la branche qu'elle a pris.
Un grand nombre de réponses ci-dessus (et sur les doublons de cette question) s'appuient sur
installed.packages
qui est mauvais. À partir de la documentation:Donc, une meilleure approche est de tenter de charger le package à l'aide de
require
et et installer si le chargement échoue (require
sera de retourFALSE
si elle n'est pas trouvé). Je préfère cette mise en œuvre:qui peut être utilisée comme ceci:
De cette façon, il charge tous les paquets, puis remonte et installe tous les paquets manquants (qui, si vous voulez, est un endroit pratique pour insérer une invite à se demander si l'utilisateur souhaite installer des paquets). Au lieu d'appeler
install.packages
séparément pour chaque paquet, il passe l'ensemble de vecteur de désinstallé les paquets juste une fois.Ici de la même fonction, mais avec une fenêtre de dialogue vous demande si l'utilisateur veut installer les paquets manquants
C'est le but de la rbundler paquet: 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. Le
bundle
fonction de regarder votre paquetDESCRIPTION
fichier pour déterminer quels paquets bundle.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
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):Voici le dépôt github du projet si vous êtes intéressé à contribuer: rbundler.
Sûr.
Vous avez besoin de comparer les 'paquets installés" par "paquets désirés'. C'est très proche de ce que je fais avec Canneberges que j'ai besoin de comparer stockés connu des forfaits "avec" actuellement connus des paquets afin de déterminer de nouvelles et/ou mise à jour des paquets.
Donc faire quelque chose comme
pour obtenir tous les packages connus, similaires appel pour les paquets actuellement installés et de les comparer à un ensemble donné de la cible paquets.
La fonction suivante fonctionne comme un charme:
(pas de mine, trouvé ceci sur le web il y a quelque temps et a été utilisé depuis lors. pas sûr de la source d'origine)
Je utiliser la fonction suivante pour installer le paquet si
require("<package>")
sorties avec package ne trouve pas d'erreur. Il interroge à la fois - CRAN et Bioconductor des référentiels pour les colis manquant.Adapté de l'œuvre originale par Joshua Wiley,
http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
Exemple:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
sera mise à jour tous les paquets installés sur le système. Cela peut prendre beaucoup de temps et de le considérer comme un R de mise à niveau qui ne peut être justifiée tout le temps!loadpack()
sur raw.githubusercontent.com/holgerbrandl/datautils/master/R/...Vous pouvez simplement utiliser la
setdiff
fonction pour obtenir les paquets qui ne sont pas installés et de les installer. Dans l'exemple ci-dessous, nous vérifions si leggplot2
etRcpp
les paquets sont installés avant de les installer.En une seule ligne, le ci-dessus peut être écrite comme:
installed.packages()[,'Package']
au lieu derownames(installed.packages())
.Utilisation
packrat
de sorte que les bibliothèques partagées sont exactement les mêmes et ne pas changer de d'autres de l'environnement.En termes d'élégance et de meilleures pratiques, je pense que votre fondamentalement aller sur le mauvais chemin. le package
packrat
a été conçu pour ces questions. Il est développé par RStudio par le Hadley Wickham. Au lieu d'avoir à installer des dépendances et éventuellement gâcher quelqu'un environnement de système d'packrat
utilise son propre répertoire et installe toutes les dépendances pour vos programmes dans leur et ne touche pas à quelqu'un de l'environnement.https://rstudio.github.io/packrat/
J'ai implémenté la fonction pour installer et charger des packages R silencieusement. L'espoir peut vous aider. Voici le code:
Au sujet de votre objectif principal "pour installer les bibliothèques, ils ne l'ont pas déjà." et indépendamment de l'utilisation de " instllaed.les packages() ". La fonction suivante masque de la fonction d'origine de besoin. Il essaie de charger et de vérifier le paquet nommé "x" , si il n'est pas installé, installez-le directement, y compris les dépendances; et enfin charger normalement. vous renommer le nom de la fonction de "besoin" à la "bibliothèque" pour maintenir l'intégrité . La seule limitation est noms des paquetages doivent être indiqués.
De sorte que vous pouvez charger et installé le package de l'ancienne façon de R.
require ("ggplot2")
require ("Rcpp")
delete
lien ci-dessus de ces commentaires. Si vous ne le faites pas, et que vous souhaitez supprimer, utilisez laflag
lien, sélectionnez "autre" et d'expliquer à un modérateur que vous souhaitez que la réponse supprimé.Assez basique.
Pensé que je pourrais contribuer celui que j'utilise:
À l'aide de lapply de la famille et de la fonction anonyme approche, vous pouvez:
||
évaluation différée).Imprimer chaque paquet final de l'état de charge (
TRUE
/FALSE
).De la prochaine version de RStudio (1.2), déjà disponible en avant-première, comprendra une fonction pour détecter les paquets manquants dans
library()
etrequire()
appels, et invite l'utilisateur à installer:Cela semble l'adresse de la préoccupation initiale de l'OP particulièrement bien:
J'utilise la suite qui va vérifier si le paquet est installé et si les dépendances sont mises à jour, puis charge le package.
Voici mon code:
Cela fonctionne avec les sociétés non cotées de noms de paquets et il est assez élégant (cf. GeoObserver réponse)
Dans mon cas, je voulais un liner que j'ai pu courir à partir de la ligne de commande (en fait par l'intermédiaire d'un Makefile). Voici un exemple de l'installation du "VGAM" et "plume" s'ils ne sont pas déjà installés:
De l'intérieur de la R il s'agirait juste d':
Il n'y a rien ici, au-delà des solutions précédentes, sauf que:
repos
paramètre (pour éviter toute popups poser des questions sur le miroir à l'utilisation).Également de noter l'importance du
character.only=TRUE
(sans cela, lerequire
voudrais essayer de charger le packagep
).