Package local et dépendances

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Package local et dépendances

Messagepar David Devreker » 08 Juin 2021, 17:09

Bonjour à tous.

Existe-t-il une solution pour installer automatiquement toutes les dépendances lorsque l'on installe localement un package (format .zip).
J'ai un code qui fonctionne bien pour les installer mais il fonctionne depuis la console R (copier-coller), j'aimerai pouvoir intégrer ce code à mon package.

Code : Tout sélectionner

r = getOption("repos")
  r["CRAN"] = "http://cran.univ-lyon1.fr/"
  options(repos = r)
  rm(r)
 
  list.of.packages <- c("package1","package2",...)
  new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
  if(length(new.packages)>0) {install.packages(new.packages)}


Même si je mets ce code au début de la première fonction (interface tcltk), je pense que R va vérifier dans le fichier Description si toutes les dépendances sont bien là... comment faire ?

Merci à tous

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Package local et dépendances

Messagepar Sébastien Rochette » 08 Juin 2021, 18:25

Bonjour,
Vous pouvez utiliser le package {remotes}

Code : Tout sélectionner

remotes::install_local("chemin/vers/zip")


Cela nécessite que le fichier DESCRIPTION du package en question soit correctement renseigné.
Si vous êtes développeur de ce package, je vous recommande {attachment} pour remplir ce fichier DESCRIPTION sans peine, avec la fonction:

Code : Tout sélectionner

attachment::att_amend_desc()
Sébastien
Dev, Consult, Formateur
ThinkR

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Package local et dépendances

Messagepar David Devreker » 08 Juin 2021, 18:52

Merci pour votre réponse (particulièrement pour la fonction attachment que je ne connaissait pas ! :-) ).

Vous voulez dire qu'en incluant la ligne de code "remotes::install_local" dans les scripts de mon package, celui-ci installera automatiquement les dépendances lors de sa première exécution (un peu comme lorsque l'on installe un package depuis un site mirroir du CRAN) , sans lancer de code dans la console R ?

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Package local et dépendances

Messagepar Sébastien Rochette » 08 Juin 2021, 19:37

ça me paraît dangereux ce que vous être en train de dire.
Dans le package que vous êtes en train de créer, il ne doit pas y avoir de code d'installation de packages. Sauf si c'est le README ou la vignette qui indique aux utilisateurs comment installer votre package.
Toutes les dépendances sont gérées par le fichier DESCRIPTION.
Sébastien
Dev, Consult, Formateur
ThinkR

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Package local et dépendances

Messagepar David Devreker » 08 Juin 2021, 19:41

Donc vous voulez dire que l'on ne peut pas forcer une installation automatique des dépendances depuis un package local comme cela est fait lorsque l'on installe un package depuis un mirroir CRAN ?

C'est dommage. Pourquoi dites-vous que c'est dangereux ?

(Mon package ne sera jamais soumis au CRAN et restera un package au format zip.)

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Package local et dépendances

Messagepar Sébastien Rochette » 08 Juin 2021, 21:43

Vous n'incluez pas la fonction d'installation dans "les scripts de votre package". Dans les scripts de votre package, j'entend ce qu'il y a dans le dossier R/, il y a vos fonctions.
La liste des dépendances est dans le fichier DESCRIPTION, rempli automatiquement par {attachment}.

Si des utilisateurs souhaitent installer votre package sur leur machine pour en utiliser les fonctions, vous devez construire le package au format zip

Code : Tout sélectionner

devtools::build()

leur envoyer le zip
et leur dire d'installer ce package avec la commande

Code : Tout sélectionner

remotes::install_local("chemin/vers/le/zip")

Celle-ci installera d'abord toutes les dépendances, puis votre package.
Sébastien
Dev, Consult, Formateur
ThinkR

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Package local et dépendances

Messagepar Mickael Canouil » 09 Juin 2021, 07:47

Bonjour,

Il y visiblement eu une incompréhension de part les informations pas très clair sur le contexte.
En recoupant les informations, on dirait que :
1. Vous avez développé une extension R pour "vous-même".
2. L'extension en question a des dépendances.
3. Vous souhaitez pouvoir installer votre extension R et ses dépendances en une seule ligne de commande.

Si tout est vrai, alors la réponse de Sébastien basée sur l'extension {remotes} est valide et se suffit à elle-même.
Pour être plus clair, "remotes::install_local" remplace "install.packages" dans ce cas.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Package local et dépendances

Messagepar David Devreker » 09 Juin 2021, 08:42

Merci à vous.

Je pense effectivement avoir été trop confus dans ma demande.

J'ai développé un package R (une interface de traitement de données). Je l'ai compilé au format zip pour pouvoir la distribuer facilement à des collègues qui potentiellement maitrise très peu R. J'aimerais que les utilisateurs potentiels n'ai pas à rentrer de fonction dans la console R.

Je voudrais simplement qu'une fois le package installé en local (via l'option de la console "Installer des packages depuis des fichiers locaux"), R installe toutes les dépendances automatiquement lors de sa première exécution du package (ou lors de son installation!) sans intervention de l'utilisateur dans la console R. A noter que l'exécution du package se fait également sans ligne de code mais directement en le chargeant dans la liste des packages ("Charger le package").

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Package local et dépendances

Messagepar Facundo Muñoz » 09 Juin 2021, 10:14

Bonjour,

Vous pouvez définir une fonction nommée .onAttach() dans votre package qui est exécutée automatiquement au moment du chargement du package (plus précisément, au moment de son attachement). Vous pouvez la définir dans n'importe quel fichier .R dans le répertoire R/ de votre package. Cependant, par convention on le fait dans un fichier zzz.R. Voir par exemple https://github.com/tidyverse/tidyverse/ ... er/R/zzz.R

Vous pouvez utiliser cette fonction pour vérifier que les dépendances soient bien installées et le cas échéant, demander à l'utilisateur l'autorisation pour les installer, voir les installer sans demander, mais ceci est considéré une très mauvaise pratique et est fortement déconseillé.

Cordialement,
ƒacu.-

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Package local et dépendances

Messagepar Mickael Canouil » 09 Juin 2021, 12:32

La solution de Facundo n'est pas adapté au final à votre utilisation.
Même si on pourrait exploiter le .onAttach() pour faire des installations, c'est carrément dangereux comme indiqué par Sébastien et surtout les installations se feraient systématiquement à chaque chargement de l'extension.

Pou revenir au problème, vous semblez vouloir utiliser une IDE sans la console R (a priori RStudio), et que tout se fasse en "clic-bouton" si je comprends bien.
En l'occurrence, votre objectif est la mise à disposition d'une interface shiny, a priori, à des utilisateurs ?
A ce niveau, un serveur shiny ou assimilé semble être le plus adapté.
Sébastien Rochette a une grande expertise à ce niveau, avec par exemple l'extension golem.

PS: l'installation d'extension local en R base

Code : Tout sélectionner

utils::install.packages(pkgs = "monextension.zip", dependencies = TRUE)
Mickaël
mickael.canouil.fr | rlille.fr

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Package local et dépendances

Messagepar David Devreker » 09 Juin 2021, 12:44

Bonjour,

j'utilise déjà cette solution, avec une fonction .onAttach() , c'est d'ailleurs grâce à cette fonction que je peux exécuter mon interface directement dans les menus de la console R, sans passer par l'écriture d'une fonction.
Mon premier essai a été d'y mettre mon code de vérification des dépendances (visible dans mon premier post), mais cela ne fonctionne pas ! R m'indique quand même que des packages sont manquant, comme s'il vérifiait le fichier Description avant de lire le .onAttach()...

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Package local et dépendances

Messagepar Facundo Muñoz » 09 Juin 2021, 12:46

Mickael Canouil a écrit :La solution de Facundo n'est pas adapté au final à votre utilisation.
Même si on pourrait exploiter le .onAttach() pour faire des installations, c'est carrément dangereux comme indiqué par Sébastien et surtout les installations se feraient systématiquement à chaque chargement de l'extension.


Bien entendu, je suggéreais :
vérifier que les dépendances soient bien installées et le cas échéant, demander à l'utilisateur l'autorisation pour les installer


En vérificant d'abord, pas besoin de reinstaller les dépendances qui sont déjà présentes et nulle installation systèmatique.

Cordialement,
ƒacu.-

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Package local et dépendances

Messagepar Facundo Muñoz » 09 Juin 2021, 12:50

David Devreker a écrit :Bonjour,

j'utilise déjà cette solution, avec une fonction .onAttach() , c'est d'ailleurs grâce à cette fonction que je peux exécuter mon interface directement dans les menus de la console R, sans passer par l'écriture d'une fonction.
Mon premier essai a été d'y mettre mon code de vérification des dépendances (visible dans mon premier post), mais cela ne fonctionne pas ! R m'indique quand même que des packages sont manquant, comme s'il vérifiait le fichier Description avant de lire le .onAttach()...


onAttach s'exécute au moment du chargement de la librairie (i.e. library(pkg)), pas au moment de l'installation.

Si vous voulez que les dépendances soient installées au moment de l'installation de votre package depuis un fichier local, je ne connais d'autre solution que celle proposée par Sébastien (remotes::install_local()).

Cordialement,
ƒacu.-


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité