Interfaces utilisateur et rapports statistiques avec R et Sas
Introduction
Chapitre 1. Environnement de travail
Chapitre 2. Le langage R
Chapitre 3. Rapports statistiques
Chapitre 4. Interfaces utilisateur
4.1. La librairie tcltk
4.1.1. Introduction
4.1.2. Zones de texte
4.1.3. Zones de liste
4.2. Les menus de Rcommander
4.3. La librairie Rpad
4.4. Exercices
Chapitre 5. Bases de données et langage Sql
Annexe A : une applette Java
Annexe B : le logiciel Sas
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante Démarrage du logiciel Webographie du module Glossaire du module

4.1.3. Zones de liste

Cette section présente une boîte de dialogue permettant de saisir un nom de variable (sous forme de zone de liste), une légende (sous forme de zone de texte) afin de faire un rapport sur cette variable d'un dataframe.

Dans un premier temps, nous allons supposer que cette boîte de dialogue s'applique uniquement au tableau de données (nommé tab) défini ci-dessous :

# le dataframe (nommé tab) utilisé pour le rapport
sexe = c("homme","femme","femme","homme","homme")
math = c(10,12,5,9,13)
anglais = c(5,13,7,12,5)
tab = data.frame(math,anglais,sexe)

Le programme R ayant permis la réalisation du formulaire a la forme suivante :

library(tcltk)
# Création de la boite de dialogue (nommée formu)
formu = tktoplevel()
tktitle(formu) = "Creation d'un rapport"
# fonctions associées aux boutons OK et Quitter
executer = function() {
	# à compléter...
}
quitter = function() {	tkdestroy(formu) }
# creation des composants : label_variable, zone_variable...
label_variable = tklabel(formu, text="variable : ")
zone_variable = tklistbox(formu, height=3, exportselection=0)
tkinsert(zone_variable,"end","math")	# ajout de math
tkinsert(zone_variable,"end","anglais")	# ajout d'anglais 
tkinsert(zone_variable,"end","sexe")	# ajout de sexe
label_legende = tklabel(formu, text="legende : ")
zone_legende = tkentry(formu)
bouton_ok = tkbutton(formu, text="OK", command=executer)	
bouton_quitter = tkbutton(formu, text="Quitter", command=quitter)	
# positionnement des composants sur 3 lignes
tkgrid(label_variable, zone_variable)
tkgrid(label_legende, zone_legende)
tkgrid(bouton_ok, bouton_quitter)
# affichage de la boite de dialogue
tkfocus(formu)

Cette boîte de dialogue comporte 6 composants : deux labels (label_variable, label_legende), une zone de liste (zone_variable), une zone de texte (zone_legende) et deux boutons de commandes (bouton_ok et bouton_quitter). Ces composants sont affichés sur 3 lignes (car 3 appels à la fonction tkgrid). Les boutons OK et Quitter sont associés aux fonctions executer et quitter. La fonction quitter ferme la fenêtre. La fonction executer, dont voici le code complet, fait un rapport sur la variable sélectionnée dans la zone de liste (zone_variable) pour le tableau de données tab :

# fonction associée au bouton OK
executer = function() {
	# recuperation des valeurs 
	variable = tclvalue( tkget(zone_variable,
			tkcurselection(zone_variable)) )
	legende = as.character( tkget(zone_legende) )
	# affichage du resume 
	resume = summary(tab[[variable]])
	print(resume)
	# graphique : boite à moustaches ou camembert
	if (is.numeric(tab[[variable]])) {
		boxplot(tab[[variable]], main=legende)
	} else {
		pie(table(tab[[variable]]), main=legende)
	}
}

Il ne faut pas confondre la zone de liste (zone_variable) avec sa valeur (variable) calculée avec les fonctions tclvalue, tkget et tkcurselection.

Si vous souhaitez réutiliser souvent cette boîte de dialogue et l'appliquer à n'importe quel tableau de données, il est conseillé de mettre tout le code dans une fonction paramétrée par un tableau de données, d'enregistrer cette fonction dans un fichier texte et de télécharger ce fichier texte en cas de besoin. La technique de construction de la zone de liste doit être adaptée pour tenir compte du tableau de données mis en paramètre :

# définition d'une fonction pour faciliter la réutilisation
zoneListe = function(tab) {
	...
	label_variable = tklabel(formu, text="variable : ")
	zone_variable = tklistbox(formu, height=length(names(tab)), 
		exportselection=0)
	for (element in names(tab)) {
		tkinsert(zone_variable,"end",element)
	}
	...
}

Vous pouvez télécharger le fichier automatiser.R qui contient la définition de cette fonction, le sauvegarder sur votre disque dur, puis enfin exécuter son contenu (commande sourcer du code R). Ensuite, il ne vous reste plus qu'à appeler cette fonction :

# appel de la fonction avec le dataframe tab précédemment construit
zoneListe(tab) 
# le dataframe peut ne pas s'appeler tab
sexe = c("homme","femme","femme","homme","homme")
taille = c(1.80,1.65,1.67,1.70,1.90)
nouveau = data.frame(sexe,taille)
zoneListe(tab=nouveau) 
Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante Démarrage du logiciel Webographie du module Glossaire du module