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?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Réponses:
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: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.
la source
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é 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/packratDason K. et moi avons le paquet pacman qui peut très bien faire ça. La fonction
p_load
du package fait cela. La première ligne consiste simplement à s'assurer que pacman est installé.la source
/
et, s'il est trouvé, d'installer / charger automatiquement à partir de github.if (!require("pacman")) install.packages("pacman")
qu'il y a une fonction appelée dans pacmanp_boot()
qui crée automatiquement cette ligne pour vous et la copie dans le presse-papiers.Vous pouvez simplement utiliser la valeur de retour de
require
:J'utilise
library
aprè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: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
.la source
character.only = TRUE
inrequire
, mais je suppose qu'il n'y a rien pour différencier votre réponse de la mienne."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.
la source
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
require
pour ce faire car ...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 ...
la source
require
nouveau après l'installation?if
instruction soit évaluée, elle doit d'abord évaluerrequire
, dont l'effet secondaire est de charger le package s'il est disponible!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 appelezrequire
comme d'habitude selon vos besoins.require
appeler le secondlibrary
pour qu'il échoue bruyamment s'il n'est toujours pas en mesure de joindre le paquet pour une raison quelconque?Beaucoup de réponses ci-dessus (et sur des doublons de cette question) se fondent sur la
installed.packages
mauvaise forme. De la documentation:Ainsi, une meilleure approche consiste à tenter de charger le package à l'aide de
require
et à installer si le chargement échoue (require
retourneraFALSE
s'il n'est pas trouvé). Je préfère cette implémentation:qui peut être utilisé comme ceci:
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.packages
sé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
la source
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:
Utilisation:
la source
la source
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
bundle
fonction examinera leDESCRIPTION
fichier de votre package pour déterminer les packages à regrouper.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
DESCRIPTION
fichier 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):Voici le dépôt github du projet si vous êtes intéressé à contribuer: rbundler .
la source
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
pour obtenir tous les packages connus, appelez simulairement les packages actuellement installés et comparez cela à un ensemble donné de packages cibles.
la source
À utiliser
packrat
pour 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,packrat
utilise son propre répertoire et installe toutes les dépendances pour vos programmes là-dedans et ne touche pas l'environnement de quelqu'un.https://rstudio.github.io/packrat/
la source
La fonction simple suivante fonctionne comme un charme:
(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)
la source
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
Exemple:
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!la source
loadpack()
sur raw.githubusercontent.com/holgerbrandl/datautils/master/R/…Vous pouvez simplement utiliser la
setdiff
fonction pour obtenir les packages qui ne sont pas installés, puis les installer. Dans l'exemple ci-dessous, nous vérifions si les packagesggplot2
etRcpp
sont installés avant de les installer.En une ligne, ce qui précède peut s'écrire:
la source
installed.packages()[,'Package']
au lieu derownames(installed.packages())
.J'ai implémenté la fonction pour installer et charger silencieusement les packages R requis. L'espoir pourrait aider. Voici le code:
la source
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 lesrequire()
appels, et invitera l'utilisateur à les installer:Cela semble répondre particulièrement bien à la préoccupation initiale du PO:
la source
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.
Vous pouvez donc charger et installer le package à l'ancienne façon de R. require ("ggplot2") require ("Rcpp")
la source
delete
lien au-dessus de ces commentaires. Si vous ne le faites pas et que vous souhaitez toujours le supprimer, utilisez leflag
lien, sélectionnez "autre" et expliquez à un modérateur que vous souhaitez que la réponse soit supprimée.Assez basique.
la source
Je pensais contribuer celui que j'utilise:
la source
la source
En utilisant l'approche familiale paresseuse et la fonction anonyme, vous pouvez:
||
évaluation paresseuse).Imprimez le statut de chargement final de chaque colis (
TRUE
/FALSE
).la source
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.
la source
Voici mon code pour cela:
la source
la source
Cela fonctionne avec les noms de paquets non cités et est assez élégant (cf. la réponse de GeoObserver)
la source
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:
De l'intérieur de R, ce serait juste:
Il n'y a rien ici au-delà des solutions précédentes, sauf que:
repos
paramètre (pour éviter toute fenêtre contextuelle demandant le miroir à utiliser)Notez également l'important
character.only=TRUE
(sans lui, lerequire
tenterait de charger le packagep
).la source
la source
Permettez-moi de partager un peu de folie:
la source