IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Esthétique de la sortie d'une fonction


Sujet :

R

  1. #1
    Invité
    Invité(e)
    Par défaut Esthétique de la sortie d'une fonction
    Bonjour,
    Je suis en train de programmer une fonction sous R et je souhaiterais rendre la sortie visuellement jolie et épurée.
    On m'a appris en cours que pour qu'une fonction retourne plusieurs valeurs, il fallait passer par une liste (peut-être que d'autres méthodes existent mais je ne les connais pas).

    Si je lance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    test<-function() {
     titre<-"Exemple"
     tab<-as.data.frame(matrix(c(2.3,0.25,6.1,1.02),nrow=2),row.names=c("Moy","Ecart type"))
     truc<-c(12,44,88)
     rep<-list(a=titre,b=tab,c=truc)
     return(rep)
    }
     
    z<-test()
    z

    J'obtiens la sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $a
    [1] "Exemple"
     
    $b
                           V1   V2
    Moy               2.30 6.10
    Ecart type      0.25 1.02
     
    $c
    [1] 12 44 88


    Ce que j'aimerais, c'est savoir s'il existe un moyen de n'avoir que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "Exemple"
     
                         V1   V2
    Moy             2.30 6.10
    Ecart type     0.25 1.02
     
    12 44 88
    mais en conservant la logique des listes : si on tape z$a, on obtient bien "Exemple"...

    Merci.
    AkaKiwi
    Dernière modification par A. D. ; 28/10/2013 à 10h20. Motif: balises "code"

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2013
    Messages : 75
    Points : 191
    Points
    191
    Par défaut
    Pour ma part, lorsque je veux redéfinir l'affichage, j'utilise le mode objet sous R ou la programmation S4.
    Pour cela il faut d'abord définir un objet S4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    setClass( Class='MaClasse',
                    representation = representation(
                    maList = 'list' )  # maList est de type liste
                  )
    Ensuite il faut redéfinir la fonction 'show' pou l'objet de type 'maClasse' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    setMethod('show', 'maClasse',
                      function(object) {
                          for (i in length(object@maList)) {
                             show(object@maList[[i]])  
                          }       
                      }
    Par défaut c'est cette fonction qui est appelée lorsque tu veux afficher le contenu d'un objet.

    Enfin dans ta fonction il faut utiliser le mot clé 'new' pour créer ton objet de type 'maClasse'.

    Sinon tu peux aussi programmer en S3, ou bien trouver une solution plus simple que d'apprendre la S4.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ton aide. J'ai exécuté ton code en ayant au préalable modifié ma fonction de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    test<-function() {
     titre<-"Exemple"
     tab<-as.data.frame(matrix(c(2.3,0.25,6.1,1.02),nrow=2),row.names=c("Moy","Ecart type"))
     truc<-c(12,44,88)
     rep<-new("MaClasse",maList=list(a=titre,b=tab,c=truc))
     return(rep)
    }

    Mais j'obtiens seulement :


    Comme je ne connaissais pas les fonctions setClass, new etc, je n'ai peut-être pas fait ce qu'il fallait ?

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2013
    Messages : 75
    Points : 191
    Points
    191
    Par défaut
    zut, j'ai fait vilain :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    setMethod('show', 'MaClasse',
                      function(object) {
                          for (i in 1:length(object@maList)) {
                             show(object@maList[[i]])  
                          }       
                      }
                )
    Maintenant cela devrait fonctionner.

  5. #5
    Membre confirmé
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    Pour information, un equivalent en S3:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ## Fonction
    test<-function() {
     titre<-"Exemple"
     tab<-as.data.frame(matrix(c(2.3,0.25,6.1,1.02),nrow=2),row.names=c("Moy","Ecart type"))
     truc<-c(12,44,88)
     rep<-list(a=titre,b=tab,c=truc)
     class(rep) <- "maclasse" # on specifie la classe de l'objet
     return(rep)
    }
     
    ## Methode print specifique pour la classe 
    print.maclasse <- function(obj) {
     for (i in obj) {
      print(i)
     }
    }
     
    test() # dans une session interactive, equivalent a print(test())
    HTH

    Vincent

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai honte... je pensais que je recevais un mail pour me prévenir lorsque quelqu'un répondait à la discussion... Du coup, deux mois après me voilà (GG)

    Bref, merci à vous deux, j'ai testé ça marche. Il faudrait que j'étudie plus en détails les objets S3 S4, mais pour ce que j'avais à faire c'est déjà très bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 28
    Dernier message: 10/08/2010, 08h14
  2. Réponses: 3
    Dernier message: 12/04/2010, 13h54
  3. Plusieurs variables en sortie d'une fonction
    Par Matgic95 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 14/05/2008, 12h05
  4. lire la sortie d'une fonction linux
    Par NexRezzo dans le forum C
    Réponses: 2
    Dernier message: 02/12/2007, 01h08
  5. Execution a la sortie d'une fonction
    Par cococococococo dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 10/07/2007, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo