Controler les sorties print()

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

Matthias Oehler
Messages : 5
Enregistré le : 05 Sep 2008, 10:00
Contact :

Controler les sorties print()

Messagepar Matthias Oehler » 21 Oct 2008, 13:46

Bonjour à tous,
J'aimerais savoir si quelqu'un a une idée de comment contrôler les sorties générer par la fonction print().
En gros l'idée est de faire une boucle de 1 à 10 ou a chaque itération la valeur de i remplacerai la valeur de i-1.

Ce que je ne veux pas c'est :

Code : Tout sélectionner

> for(i in 1:10) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10


mais plutot :

Code : Tout sélectionner

> for(i in 1:10) print(i)
[1] 1
qui devient
> for(i in 1:10) print(i)
[1] 2
qui devient
> for(i in 1:10) print(i)
[1] 3
qui devient
> for(i in 1:10) print(i)
[1] 4
etc. etc.


Il faudrait demander d'effacer la sortie précédente et afficher la nouvelle sortie, mais malgré quelques recherches je ne trouve pas de fonction permettant de contrôler les sorties.

Merci d'avance pour votre aide.

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 21 Oct 2008, 14:27

Je ne suis pas un spécialiste de la programmation dans l'environnement R mais ce que tu souhaites faire (si j'ai bien compris : une sorte d'afficheur comme un compteur analogique) me paraît inenvisageable dans la console de R. print n'est pas une simple fonction mais une méthode et est donc à la base du fonctionnement de R. Il faut donc reprogrammer print ce qui suppose de bien maitriser le langage S (S3 ou S4). un module en C doit pouvoir se faire ou encore une fenêtre GUI.

Ce n'est que mon avis....d'autres membres du forum pourront peut être t'aiguiller un peu meiux voire infirmer ce que j'ai dit.

Nicolas

Matthias Oehler
Messages : 5
Enregistré le : 05 Sep 2008, 10:00
Contact :

Messagepar Matthias Oehler » 21 Oct 2008, 15:42

Effectivement Nicolas, tu as bien compris. Je voulais faire un compteur analogique affichant le % de progression d'un calcul.

En fouillant un peu plus, j'ai trouvé la fonction txtProgressBar() qui fait exactement ça (en plus complet).

Mais bon je suis quand même preneur si quelqu'un connait une solution, cela peut être utile dans d'autre cas (tout ce qui peut nécessiter une information une l'étape courante).

En attendant je vais dépecer ladite fonction.

Merci bien

Matthias Oehler
Messages : 5
Enregistré le : 05 Sep 2008, 10:00
Contact :

Messagepar Matthias Oehler » 21 Oct 2008, 17:18

Bon ben voilà.

Une bonne manip de la POO et des fonctions invisible() et flush.console() permet de faire ce fameux compteur.

Pour ne pas mentir, j'ai trouver en m'inspirant largement de la fonction txtProgressBar() dont voici un exemple très simplifié :

Code : Tout sélectionner

compteur <- function (value)
{
  # On initialise val à 0
  .val <- 0
  # Getter
  getVal <- function() .val
  # Setter
  setVal <- function(value)
  {
    .val <<- value
    cat(paste(c("\r", value, collapse = "")))
    flush.console()
  }
  #Definition de l'objet
  structure(list(getVal = getVal, setVal = setVal), class = "compteur")
}

#Construction de l'objet compteur
obj <- compteur()
for(i in 1:1000) {
  oldval <- pb$getVal()
  pb$setVal(i)
  invisible(oldval)
}

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

Messagepar jean lobry » 21 Oct 2008, 17:49

Matthias Oehler a écrit :Une bonne manip de la POO et des fonctions invisible() et flush.console() permet de faire ce fameux compteur.


Bonjour,

tu peux peut-être simplifier en :

Code : Tout sélectionner

for(i in 1:10000) {cat("\r",i); flush.console()}


Amicalement,

Jean

Matthias Oehler
Messages : 5
Enregistré le : 05 Sep 2008, 10:00
Contact :

Messagepar Matthias Oehler » 21 Oct 2008, 21:00

Je m'incline bien bas...
Merci bien

Décidément j'en aurais appris aujourd'hui :o


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité