Galère avec NAMESPACE

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

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Galère avec NAMESPACE

Messagepar Christophe Genolini » 31 Mai 2008, 23:30

Bonjour

Je suis en train de finir un package. Pour construire mes fonctions finales (4 fonctions pour l'utilisateur), j'ai utilisé de nombreuses petites fonctions (a peut pret 80) que je ne veux pas documenter, parce que ca n'aurait aucun interet (et que j y serais encore a Noel).

J'ai donc essayé d'ajouter un fichier NAMESPACE, mais il ne parle visiblement pas le même langage que moi... Et je ne capte pas grand chose au "writing R extension" sur ce point précis...

Jusqu'à présent, j'avais cru comprendre que pour rendre la fonction pourUser() visible et pour cacher pourMoi(), il fallait faire :

export("pourUser")

Mais visiblement, ca ne marche pas, R CMD check me signale que la fonction pourMoi n'est pas trouvable...

Quelqu'un a une piste ?

Christophe

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Galère avec NAMESPACE

Messagepar Renaud Lancelot » 01 Juin 2008, 09:59

Christophe Genolini a écrit :Bonjour

Je suis en train de finir un package. Pour construire mes fonctions finales (4 fonctions pour l'utilisateur), j'ai utilisé de nombreuses petites fonctions (a peut pret 80) que je ne veux pas documenter, parce que ca n'aurait aucun interet (et que j y serais encore a Noel).

J'ai donc essayé d'ajouter un fichier NAMESPACE, mais il ne parle visiblement pas le même langage que moi... Et je ne capte pas grand chose au "writing R extension" sur ce point précis...


Va expliquer ça sur Rdev ;-)

Jusqu'à présent, j'avais cru comprendre que pour rendre la fonction pourUser() visible et pour cacher pourMoi(), il fallait faire :

export("pourUser")

Mais visiblement, ca ne marche pas, R CMD check me signale que la fonction pourMoi n'est pas trouvable...

Quelqu'un a une piste ?

Christophe


Le plus simple est de prendre l'exemple d'un package avec un NAMESPACE un peu chiadé, comme lme4 (qui est en interaction avec les NAMESPACE des packages Matrix, graphics, stats, lattice).

Code : Tout sélectionner

useDynLib(lme4, .registration=TRUE)

import("Matrix")
importFrom("graphics", plot)
import("stats", "lattice")
#importFrom("utils", head, tail)  ## already available in Matrix

export(
       "gsummary",
       "hatTrace",
       "lmList",
       "lmer",
       "lmer2",
       "mcmcsamp",
       "nlmer",
       "pedigree",
       "pooledSD"
       )

exportClasses(
              "coef.lmer",
              "glmer",
              "glmer2",
              "lmList",
              "lmer",
              "lmer2",
              "mer",
              "nlmer",
              "pedigree",
              "ranef.lmer",
              "summary.glmer",
              "summary.lmer",
              "summary.mer"
              )

exportMethods(
              "BIC",
              "VarCorr",
              "anova",
              "chol",
              "coef",
              "coerce",
              "confint",
              "deviance",
              "fitted",
              "fixef",
              "formula",
              "gsummary",
              "head",
              "logLik",
              "mcmcsamp",
              "plot",
              "print",
              "qqmath",
              "ranef",
              "resid",
              "residuals",
              "show",
              "simulate",
              "summary",
              "tail",
              "terms",
              "update",
              "vcov",
              "with"
              )



Renaud

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Re: Galère avec NAMESPACE

Messagepar Christophe Genolini » 01 Juin 2008, 16:35

Renaud Lancelot a écrit :Va expliquer ça sur Rdev ;-)


Un truc du genre :

Salut la R dev. Votre p'tit logiciel R est sympa, mais pour expliquer les trucs, z'tes vraiment des blaireaux... :shock:


Hmmm.
Finallement, je vais m'abstenir... ;-)

Samir Messad
Messages : 76
Enregistré le : 10 Jan 2005, 20:56

Afficher un message à l'activation d'un package avec .onLoad

Messagepar Samir Messad » 27 Avr 2012, 10:15

Salut,

eh bien moi aussi je galère avec NAMESPACE pour un truc qui me semblait très simple : afficher un message dans la console au chargement d'un package.
Pour ce faire, j'ai écrit une fonction .onLoad de ce genre :

Code : Tout sélectionner

.onLoad <- function(libname, pkgname){
    desc <- packageDescription("tdisplay")
    packageStartupMessage(cat(sprintf("Package %s, version %s","tdisplay", desc$Version), "\n"))
}


j'ai rangé cette fonction dans un fichier zzz.r avec les autres fonctions du package. Un fichier NAMESPACE est bien spécifié (généré automatiquement à la création du package) mais je n'obtient pas le message souhaité au moment où j'active le package :

Code : Tout sélectionner

library(tdisplay)


J'ai passé du temps à lire et relire 'Writing R extensions' et pour moi cette phrase (page 35) reste sibylline : "These hook functions are called .onLoad and .onAttach. They both take arguments libname and pkgname; they should be defined in the namespace but not exported"

Que signifie 'Ils doivent être défini dans le namespace ?' faut-il ajouter une directive dans le le fichier NAMESPACE ? Mes recherches sur les forums et les exemples d'utilisations de .onLoad dans divers packages ne m'ont pas fait avancer sur cette question.

Merci pour votre aide.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 27 Avr 2012, 13:01

Bonjour,
pour les packages avec NAMESPACE, c'est la fonction .onAttach() et pas .onLoad() qui doit être utilisée.
Maxime

Samir Messad
Messages : 76
Enregistré le : 10 Jan 2005, 20:56

Messagepar Samir Messad » 27 Avr 2012, 13:26

oui, j'ai aussi essayé avec la fonction .onAttach() qui est préconisée par le CRAN mais sans résultat. Dans les quelques échanges forum que j'ai pu lire, les RUsers utilisaient .onLoad pour, en autres, afficher un message au chargement du package.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 27 Avr 2012, 14:02

Moi perso j'utilise ça (packages avec NAMESPACE) :

Code : Tout sélectionner

.onAttach <- function(lib,pkg) {
  packageStartupMessage("\n*** Package xxx version xxx ***\n")
}

Et ça marche très bien...

Samir Messad
Messages : 76
Enregistré le : 10 Jan 2005, 20:56

Messagepar Samir Messad » 27 Avr 2012, 15:10

Avez-vous modifié le fichier NAMESPACE généré automatiquement par la procédure de création du package ?

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 27 Avr 2012, 16:03

Non, j'ai uniquement cette ligne dans le NAMESPACE

Code : Tout sélectionner

exportPattern("^[[:alpha:]]+")

Samir Messad
Messages : 76
Enregistré le : 10 Jan 2005, 20:56

Messagepar Samir Messad » 27 Avr 2012, 17:26

merci Maxime pour votre aide.

J'ai enfin identifié le problème.
A la construction du package avec package.skeleton, il faut bien indiquer que l'on veut intégrer les hook fonctions (.onLoad, onAttach, ...) en les spécifiant explicitement. J'utilise ls() pour gagner du temps mais je n'ai pas modifié à TRUE l'argument all.names afin de prendre en compte ces fonctions cachés :
package.skeleton(name="t12mo", list=ls(all.names = TRUE), path="C:/Rdevel")


Encore un truc que l'on ne trouvera jamais dans un manuel ...

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Messagepar jean lobry » 27 Avr 2012, 21:57

Samir Messad a écrit :Encore un truc que l'on ne trouvera jamais dans un manuel ...
Bonjour,

pourquoi tant de pessimisme ? Si c'est vraiment utile on le retrouvera forcément dans un manuel ! Au pire, tu l'écris !

Amicalement,

Jean

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 28 Avr 2012, 06:27

Il y avait une autre solution : rajouter le ficher zzz.R manuellement dans le dossier "R" du package. C'est ce que je fais tout le temps, c'est aussi simple :)
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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