Listing du fichier intror2.php
00001 <?php
00002 # (gH) -_- intror2.php ; TimeStamp (unix) : 19 Août 2013 vers 20:16
00003
00004 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00005
00006 include_once("std7.php") ;
00007 include_once("intror_inc.php") ;
00008 include_once("../../statuno.php") ;
00009
00010 $numSerie = 2 ;
00011 debutPageExoScr1($numSerie) ;
00012
00013 ## -------------------------------------------------------------------------------------------
00014
00015 sdl(3) ; echo cmt(' pour afficher toutes les solutions : intror2.php?solutions=1') ; sdl(3) ;
00016
00017 ## -------------------------------------------------------------------------------------------
00018
00019 p("texte") ;
00020 echo "" ;
00021 finp() ;
00022 debutSection() ;
00023
00024 $tableauDesRubriques = array() ;
00025 $idr = 0 ;
00026 $idr++; $tableauDesRubriques[$idr] = "Répertoires, scripts et fonctions (gH)" ;
00027 $idr++; $tableauDesRubriques[$idr] = "Lecture de fichiers textes, bureautique et gestion des accents" ;
00028 $idr++; $tableauDesRubriques[$idr] = "Listes en $R" ;
00029 $idr++; $tableauDesRubriques[$idr] = "Variables quantitatives et qualitatives" ;
00030 $idr++; $tableauDesRubriques[$idr] = "Récupération de tableaux $HTML" ;
00031 $idr++; $tableauDesRubriques[$idr] = "Regroupement et fusion de données" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Indiçage, filtrage et sélection de données" ;
00033 $idr++; $tableauDesRubriques[$idr] = "Conversion de structures de données en $R" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Gestion des données manquantes" ;
00035 $idr++; $tableauDesRubriques[$idr] = "Export de données en $HTML et $LaTeX" ;
00036 $idr++; $tableauDesRubriques[$idr] = "$R et SQL" ;
00037 $idr++; $tableauDesRubriques[$idr] = "Non présentation (!) des packages base, gdata, tools, foreign et utils" ;
00038 $tdmCRLM = new tdm($tableauDesRubriques) ;
00039 $tdmCRLM->titre() ;
00040 $tdmCRLM->menu("oui","oui","nou") ;
00041
00042 pvide() ;
00043
00044 p() ;
00045 echo "Il est possible d'afficher toutes les solutions via ".href("intror2.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ;
00046 finp() ;
00047
00048 finSection() ;
00049
00050 debutSection() ;
00051 $numExo = 0 ;
00052
00053 ## -------------------------------------------------------------------------------------------
00054
00055 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Répertoires, scripts et fonctions (gH)
00056
00057 ## -------------------------------------------------------------------------------------------
00058
00059 blockquote() ;
00060
00061 blockquote() ;
00062
00063 p("texte") ;
00064 echo " Comment dire à $R qu'on veut changer de répertoire ?" ;
00065 echo " Et connaitre le répertoire en cours ?" ;
00066 echo " Qu'est-ce qu'un script ?" ;
00067 echo " Faut-il programmer pour écrire un script ?" ;
00068 echo " A quoi servent les fonctions " ;
00069 echo hrrr("source") ;
00070 echo " et " ;
00071 echo hrrr("sink")." ?" ; ;
00072 echo " Comment charger les ".b("fonctions (gH)")." ?" ;
00073 finp() ;
00074
00075 finblockquote() ;
00076
00077 solution($numExo,$numSerie) ;
00078
00079 p("texte") ;
00080 echo "Pour changer de répertoire, il faut utiliser la fonction " ;
00081 echo hrrr("getwd","","setwd()") ;
00082 echo" et pour connaitre le répertoire en cours, on utilise " ;
00083 echo hrrr("getwd")."." ;
00084 finp() ;
00085
00086 p("texte") ;
00087 echo "Un script est juste un ensemble de commandes $R écrites dans un fichier, comme celles dans les encadrés en bleu clair de cette page. " ;
00088 echo " Il n'y a pas besoin de savoir programmer pour écrire des scripts élémentaires. " ;
00089 echo " Pour éxécuter un script dans une session, on utilise la fonction " ;
00090 echo hrrr("source")." avec éventuellement les paramètres ".b("echo").", ".b("verbose").", ".b("print.eval")." etc. " ;
00091 echo " La fonction " ;
00092 echo hrrr("sink")." permet de gérer la sortie des affichages, voire de la rediriger vers un fichier, pour conserver une trace " ;
00093 echo " de ce qui a été exécuté. ";
00094 finp() ;
00095
00096 p("texte") ;
00097 echo "Voici un exemple de script, nommé (!) ".href("prog.r")." encodé en ISO8859-1." ;
00098 finp() ;
00099
00100 entree_R("prog.r") ;
00101
00102 p("texte") ;
00103 echo "Voici ce qui se passe si on essaie de l'exécuter sous Linux (qui utilise par défaut un encodage UTF). " ;
00104 finp() ;
00105
00106 sortie_R("script1_sor.txt") ;
00107
00108 p("texte") ;
00109 echo "Il faut donc utiliser le paramètre ".b("encoding")." ici : " ;
00110 finp() ;
00111
00112 sortie_R("script2_sor.txt") ;
00113
00114 p("texte") ;
00115 echo "C'est déjà mieux, sauf pour la sortie... Par contre, on ne voit pas quelles affectations ont été exécutées. " ;
00116 echo " Essayons avec le paramètre ".b("echo")." :" ;
00117 finp() ;
00118
00119 sortie_R("script3_sor.txt") ;
00120
00121 p("texte") ;
00122 echo "Ce n'est pas cela, mais au moins, on voit quelle instruction est exécutée. La solution doit sans doute utiliser " ;
00123 echo " le paramètre ".b("print.eval")." :" ;
00124 finp() ;
00125
00126 sortie_R("script4_sor.txt") ;
00127
00128 p("texte") ;
00129 echo "Enfin, on peut avoir encore plus de détails avec le paramètre ".b("verbose")." :" ;
00130 finp() ;
00131
00132 sortie_R("script5_sor.txt") ;
00133
00134 p("texte") ;
00135 echo "Les ".b("fonctions (gH)")." sont un ensemble de fonctions qui calculent puis affichent en français disponibles sur internet, à l'adresse " ;
00136 echo href("http://forge.info.univ-angers.fr/~gh/statgh.r","statgh.r").". " ;
00137 echo " Une page d'explication nommée ".href("http://forge.info.univ-angers.fr/~gh/wstat/statgh.php","statgh.php")." leur est consacrée et " ;
00138 echo " une interface les montre à l'adresse ".href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php","statghfns.php").". " ;
00139 echo " Nous conseillons d'apprendre à utiliser " ;
00140 echo href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=cats","cats()").", " ;
00141 echo href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=catss","catss()")." et surtout " ;
00142 echo href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=sinksrc","sinksrc()")." pour travailler sereinement avec les scripts. " ;
00143 echo " C'est grâce à cette dernière fonction que nous avons produit toutes les sorties de ces pages Web." ;
00144
00145
00146 finp() ;
00147
00148 finsolution() ;
00149
00150 finblockquote() ;
00151
00152 ## -------------------------------------------------------------------------------------------
00153
00154 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Lecture de fichiers textes et Excel et gestion des accents
00155
00156 ## -------------------------------------------------------------------------------------------
00157
00158 blockquote() ;
00159
00160 blockquote() ;
00161
00162 p("texte") ;
00163 echo "Comment lire un fichier-texte de valeurs numériques comme ".href("elf.txt")." avec R ? " ;
00164 echo "Et un fichier Excel comme ".href("elf.xls")." ou ".href("elf.xlsx")." ? " ;
00165 echo "Et un fichier Open Office Calc comme ".href("elf.ods")." ? " ;
00166 echo " Et un fichier avec des valeurs caractères comme ".href("elf2.txt")." ? " ;
00167 echo " Et un fichier CSV ou un fichier délimité avec des points-virgules ?" ;
00168 finp() ;
00169
00170 p("texte") ;
00171 echo "R sait-il lire des fichiers avec des accents Windows ? des accents ISO, UTF ?" ;
00172 finp() ;
00173
00174 p("texte") ;
00175 echo " Comment lire du texte \"brut\" ? " ;
00176 finp() ;
00177
00178 p("texte") ;
00179 echo em("Questions spécialisées :") ;
00180 finp() ;
00181
00182 p("texte") ;
00183 echo "«Mes données ont parfois des lignes vides et des commentaires, comme ci-dessous " ;
00184 echo "(fichier ".href("dataspec.txt").") :" ;
00185 finp() ;
00186
00187 pre_fichier("dataspec.txt","cadre") ;
00188
00189 p("texte") ;
00190 echo " Comment les lire avec $R ?»" ;
00191 finp() ;
00192
00193 p("texte") ;
00194 echo "«Moi, j'utilise souvent des données issues du site web " ;
00195 #echo href("http://www.dna.affrc.go.jp/PLACE/signalup.html","PLACE","gbleuf nou") ;
00196 #echo href("http://www.dna.affrc.go.jp/PLACE/","PLACE","gbleuf nou") ;
00197 echo href("https://www.ncbi.nlm.nih.gov/pubmed/9847208?dopt=Abstract","PLACE","gbleuf nou") ;
00198 echo " et mes données ressemblent à " ;
00199 finp() ;
00200
00201 pre_fichier("demoplace.txt","cadre") ;
00202
00203 p("texte") ;
00204 echo " Comment récupérer juste les indications de comptage et de localisation de site ?»" ;
00205 finp() ;
00206
00207 finblockquote() ;
00208
00209 solution($numExo,$numSerie) ;
00210
00211 p("texte") ;
00212 echo "Comme nous l'avons vu dans la séance 1, $R dispose avec la fonction " ;
00213 echo hrrr("read.table","utils","","gvert nou") ;
00214 echo " de nombreuses options pour lire les fichiers-textes. " ;
00215 echo "Cette fonction ".hrrr("read.table","utils","","gvert nou") ;
00216 echo " appartient au package ".hrrp("utils").". " ;
00217 finp() ;
00218
00219 p("texte") ;
00220 echo "Les fichiers qui contiennent des données numériques pour traitements statistiques ont en général une structure " ;
00221 echo " particulière, à savoir un nombre constant de \"mots-valeur\" par ligne, ce qui permet de parler de colonnes de " ;
00222 echo" chiffres ou ".em("variables statistiques").". " ;
00223 echo " Ces valeurs sont souvent délimitées ou séparées par un même symbole, parfois répété, comme l'espace, " ;
00224 echo " le caractère de tabulation, la virgule ou le point virgule. " ;
00225 echo " En particulier le format dit " ;
00226 echo href("http://en.wikipedia.org/wiki/Comma-separated_values","CSV") ;
00227 echo " est très prisé par les statisticien(nes). " ;
00228 echo " $R sait le traiter avec la fonction " ;
00229 echo hrrr("read.table","utils","read.csv()","gvert nou") ;
00230 echo ". Comme les américains utilisent un point pour les décimales, la virgule peut servir de séparateur. " ;
00231 echo " En France, la virgule sert pour les décimales et on utilise donc plutôt le point-virgule comme " ;
00232 echo " séparateur, d'où les fonctions " ;
00233 echo hrrr("read.table","utils","read.csv()","gvert nou") ;
00234 echo " et " ;
00235 echo hrrr("read.table","utils","read.csv2()","gvert nou") ;
00236 echo ", mais il est possible, bien sûr, d'indiquer son propre délimiteur." ;
00237 echo " Cette notion de structure en colonne définit ce que $R nomme des ".b("data frame").". " ;
00238 echo " Utiliser ".hrrr("read.table","utils","","gvert nou")." renvoie un data frame." ;
00239 echo " Les data frame ressemblent à des matrices, avec des lignes et des colonnes, mais ce ne sont pas des matrices " ;
00240 echo " car ce sont des listes." ;
00241 finp() ;
00242
00243 entree_R("dataframe.r") ;
00244 sortie_R("dataframe_sor.txt") ;
00245
00246
00247 p("texte") ;
00248 echo "L'intérêt du format " ;
00249 echo href("http://fr.wikipedia.org/wiki/Comma-separated_values","CSV") ;
00250 echo " est d'être un format-texte et qu'on peut donc voir les données avec un simple " ;
00251 echo " navigateur ou même un éditeur de texte (par exemple pour effectuer des " ;
00252 echo s_span("Edition/Remplacer tout","gvert")." si besoin est). Les logiciels Excel et " ;
00253 echo " Open Office Write savent bien exporter dans ces formats." ;
00254 finp() ;
00255
00256
00257 p("texte") ;
00258 echo "Pour lire le fichier ".href("elf.txt").", un simple appel de " ;
00259 echo hrrr("read.table","utils","","gvert nou") ;
00260 echo " suffit. Il n'y a pas d'indication de nom de colonne en ligne 1, " ;
00261 echo " donc le paramètre ".b("head")." doit être mis à faux (FALSE en anglais). Le mot 1 de chaque ligne semble être un identifiant. " ;
00262 echo " Si tel est le cas, il faut utiliser ".b("row.names=1")." sinon, pas besoin de préciser ".b("row.names").". " ;
00263 echo " La fonction ".hrrr("colnames","base","colnames()") ;
00264 echo " permet de définir ou de réfinir tout ou partie des noms de colonnes. " ;
00265 finp() ;
00266
00267 entree_R("litelf1.r") ;
00268 sortie_R("litelf1_sor.txt") ;
00269
00270 p("texte") ;
00271 echo "Pour lire le fichier Excel ".b(".xls")." correspondant, il faut avoir installé le " ;
00272 echo " package ".hrrp("gdata").". " ;
00273 echo " On dispose alors de la fonctions " ;
00274 echo hrrr("read.xls","gdata","","gvert nou") ;
00275 echo " alors que pour lire la version ".b(".xlsx")." du fichier, il faut avoir installé le " ;
00276 echo " package ".hrrp("xlsx")." qui fournit la fonction " ;
00277 echo hrrr("read.xlsx","xlsx","","gvert nou") ;
00278 echo " dont le paramètre ".b("sheetIndex")." est requis, sans valeur par défaut." ;
00279 echo " On peut aussi utiliser le package " ;
00280 echo hrrp("XLConnect").", mais on ne peut lire que des fichiers locaux. " ;
00281 echo hrrp("XLConnect")." écrit aussi des fichiers Excel. La lecture de " ;
00282 echo href("http://cran.r-project.org/web/packages/XLConnect/XLConnect.pdf","XLConnect.pdf")." est conseillée." ;
00283 finp() ;
00284
00285 entree_R("litelf2.r") ;
00286 sortie_R("litelf2_sor.txt") ;
00287
00288 p("texte") ;
00289 echo "Il n'est pas forcément aisé de lire des fichiers ".b(".ods")." car la fonction " ;
00290 echo hrrr("read.gnumeric.sheet","gnumeric","","gvert nou") ;
00291 echo " du package ".hrrp("gnumeric")." requiert que le logiciel " ;
00292 echo href("https://projects.gnome.org/gnumeric/","gnumeric") ;
00293 echo " soit aussi installé, à cause de sa commande ".b("ssconvert").". " ;
00294 echo " Nous conseillons plutôt d'enregistrer le fichier ".b(".ods")." en ".b(".xls") ;
00295 echo " et de lire comme ci-dessus. Il n'est pas conseillé d'enregistrer en ".b(".xlsx") ;
00296 echo " parce que cela produit des fichiers plus gros, plus complexes " ;
00297 echo " (les fichiers .xlsx sont en fait des archives qui contiennent des fichiers XML), " ;
00298 echo " ce qui rend la lecture plus lente." ;
00299 finp() ;
00300
00301 p("texte") ;
00302 echo "Lorsqu'on lit des données caractères, $R en fait automatiquement par défaut des facteurs, c'est-à-dire des " ;
00303 echo " variables qualitatives dont les modalités sont les divers mots rencontrés. Pour modifier ce comportement, " ;
00304 echo " il faut utiliser le paramètre ".b("as.is")." de " ;
00305 echo hrrr("read.table","utils","","gvert nou").". " ;
00306 finp() ;
00307
00308 entree_R("litelf3.r") ;
00309 sortie_R("litelf3_sor.txt") ;
00310
00311
00312 p("texte") ;
00313 echo "La prise en compte des accents se fait avec le paramètre ".b("encoding='latin1'")."." ; # ." :" ;
00314 echo " On peut aussi utiliser " ;
00315 echo hrrr("Encoding") ;
00316 echo " et " ;
00317 echo hrrr("iconv")."." ;
00318 finp() ;
00319
00320 sortie_R("litelf4_sor.txt") ;
00321
00322 p("texte") ;
00323 echo "Pour lire un fichier-texte \"littéraire\" comme ".href("cigale.txt").", on utilise " ;
00324 echo hrrr("readLines").", sachant qu'en mode interactif, " ;
00325 echo hrrr("readline")." (sans \"s\" et avec un \"l\" minuscule) assure la lecture au clavier." ;
00326 finp() ;
00327
00328 sortie_R("fable_sor.txt") ;
00329
00330 p("texte") ;
00331 echo em("Réponses aux questions spécialisées :") ;
00332 finp() ;
00333
00334 p("texte") ;
00335 echo "Les lignes vides et les commentaires ne sont pas un problème car $R a des options pour cela. " ;
00336 echo " Voici les instructions $R correspondantes à la lecture de ".href("videcmt.txt").". Tout le travail est fait par " ;
00337 echo hrrr("read.table","utils","","gvert nou")."." ;
00338 finp() ;
00339
00340 entree_R("videcmt.r") ;
00341
00342 p("texte") ;
00343 echo " Et le résultat de leur exécution :" ;
00344 finp() ;
00345
00346 sortie_R("videcmt.res") ;
00347
00348 p("texte") ;
00349 echo "Par contre la lecture des fichiers pour le logiciel " ;
00350 #echo href("http://www.dna.affrc.go.jp/PLACE/signalup.html","PLACE","gbleuf nou") ;
00351 echo b("PLACE") ;
00352 echo " ne peut pas se faire de façon simple. Il faut écrire un programme " ;
00353 echo " pour parcourir les lignes, ignorer ce qu'on lit tant qu'on n'a pas vu la première ligne de tirets, puis " ;
00354 echo " découper les lignes et s'arrêter lorsque qu'on rencontre la seconde ligne de tirets. Il faut donc " ;
00355 echo " apprendre à programmer en $R pour y arriver, ce qui est le sujet d'une autre session de cours... " ;
00356 finp() ;
00357
00358 finsolution() ;
00359
00360 finblockquote() ;
00361
00362 ## -------------------------------------------------------------------------------------------
00363
00364 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Listes en $R
00365
00366 ## -------------------------------------------------------------------------------------------
00367
00368 blockquote() ;
00369
00370 blockquote() ;
00371
00372 p("texte") ;
00373 echo "Quelle est la différence entre une liste et un vecteur ?" ;
00374 echo " Comment utilise-t-on les listes en $R ?" ;
00375 finp() ;
00376
00377 finblockquote() ;
00378
00379 solution($numExo,$numSerie) ;
00380
00381 p("texte") ;
00382 echo "Une liste se crée avec ".hrrr("list").". " ;
00383 echo " Comme un vecteur, c'est un conteneur, mais les divers éléments peuvent être de nature différente. " ;
00384 echo " Il est d'usage de parler des éléments d'un vecteur et des composant[e]s d'une liste. Eléments et composants " ;
00385 echo " peuvent être nommés, mais l'usage veut qu'on nomme surtout les composants. On accède aux composants " ;
00386 echo " par leur nom et/ou leur position. On peut appliquer une fonction à tous les composants d'une liste avec " ;
00387 echo hrrr("lapply").", qui renvoie une liste, et avec " ;
00388 echo hrrr("lapply","base","sapply").", qui renvoie un vecteur. " ;
00389 echo " Le nombre de composants s'obtient avec la fonction ".hrrr("length").". " ;
00390 finp() ;
00391
00392 entree_R("liste.r") ;
00393 sortie_R("liste_sor.txt") ;
00394
00395 # détailler ifelse() et cut()
00396
00397 finsolution() ;
00398
00399 finblockquote() ;
00400
00401 ## -------------------------------------------------------------------------------------------
00402
00403 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Variables qualitatives et quantitatives
00404
00405 ## -------------------------------------------------------------------------------------------
00406
00407 blockquote() ;
00408
00409 blockquote() ;
00410
00411 p("texte") ;
00412 echo "Comment $R gère-t-il les variables qualitatives et quantitatives ?" ;
00413 echo " Qu'obtient-on quand on lit des données dans un fichier, du quantitatif ou du qualitatif ?" ;
00414 finp() ;
00415
00416 finblockquote() ;
00417
00418 solution($numExo,$numSerie) ;
00419
00420 p("texte") ;
00421 echo "R n'a qu'une seule règle : tout ce qui est numérique est quantitatif. Et donc, comme corollaire, tout ce qui est caractère est qualitatif. " ;
00422 echo " Pour convertir de quantitatif à qualitatif, il faut passer par la fonction " ;
00423 echo hrrr("factor")." et indiquer les labels des modalités. Dans le vocabulaire R, les variables qualitatives sont dénommées ".em("facteurs").". " ;
00424 echo "Par contre, pour convertir dans l'autre sens, si l'on connait des bornes de découpage, on peut utiliser " ;
00425 echo hrrr("ifelse")." et " ;
00426 echo hrrr("cut").". " ;
00427 finp() ;
00428
00429 entree_R("facteurs.r") ;
00430 sortie_R("facteurs_sor.txt") ;
00431
00432 # détailler ifelse() et cut()
00433
00434
00435 p("texte") ;
00436 echo b("Remarque : ") ;
00437 echo " si on veut garder toutes les colonnes caractères sous forme de chaines de caractères, il faut préciser ".b("as.is=TRUE")." dans la lecture des fichiers " ;
00438 echo " ou utiliser ".b("stringsAsFactors=FALSE").". " ;
00439 finp() ;
00440 finsolution() ;
00441
00442 finblockquote() ;
00443
00444 ## -------------------------------------------------------------------------------------------
00445
00446 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Récupération de tableaux HTML
00447
00448 ## -------------------------------------------------------------------------------------------
00449
00450 blockquote() ;
00451
00452 blockquote() ;
00453
00454 p("texte") ;
00455 echo "Si on lit la page du wiki anglais sur les acides aminés, soit " ;
00456 echo href("http://en.wikipedia.org/wiki/Amino_acid","[...]wiki/Amino_acid") ;
00457 echo " les tableaux 2 (classification) et 4 (propriétés) semblent très intéressants. Comment récupérer leur contenu dans un data frame ?" ;
00458 finp() ;
00459
00460 p("texte") ;
00461 echo "Reprendre avec le tableau 4 (propriétés) de la " ;
00462 echo href("http://fr.wikipedia.org/wiki/Acide_amin%C3%A9","page correspondante","nou gbleuf") ;
00463 echo " du wiki français. " ;
00464 finp() ;
00465
00466 finblockquote() ;
00467
00468 solution($numExo,$numSerie) ;
00469
00470 p("texte") ;
00471 echo "Avec la fonction " ;
00472 echo hrrr("readHTMLTable","XML") ;
00473 echo " du package ";
00474 echo hrrp("XML").", rien de plus simple, la preuve :" ;
00475 finp() ;
00476
00477 entree_R("readwikiaa.r") ;
00478
00479 p("texte") ;
00480 echo "Résultats d'exécution :" ;
00481 finp() ;
00482
00483 div("pluspetit") ;
00484 sortie_R("readwikiaa_sor.txt") ;
00485 findiv() ;
00486
00487 p("texte") ;
00488 echo "Mais bien sûr un peu de \"ménage\" ne fait pas de mal :" ;
00489 finp() ;
00490
00491 entree_R("readwikiaa2.r") ;
00492
00493 p("texte") ;
00494 echo "Résultats d'exécution :" ;
00495 finp() ;
00496
00497 sortie_R("readwikiaa2_sor.txt") ;
00498
00499 finsolution() ;
00500
00501 finblockquote() ;
00502
00503 ## -------------------------------------------------------------------------------------------
00504
00505 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Regroupement et fusion de données
00506
00507 ## -------------------------------------------------------------------------------------------
00508
00509 blockquote() ;
00510
00511 blockquote() ;
00512
00513 p("texte") ;
00514 echo "On veut fusionner horizontalement (dans le sens des lignes) les fichiers ".href("datah1.txt")." et ".href("datah2.txt").". " ;
00515 echo " Quel code $R faut-il écrire ? " ;
00516 echo " Et si on veut fusionner verticalement (dans le sens des colonnes) les fichiers ".href("datav1.txt")." et ".href("datav2.txt")." ? " ;
00517 finp() ;
00518
00519 p("texte") ;
00520 echo "Plus généralement, comment fusionner des données selon une colonne commune, " ;
00521 echo " par exemple pour ".href("partie1.txt")." et ".href("partie2.txt")." ?" ;
00522 finp() ;
00523
00524 finblockquote() ;
00525
00526 solution($numExo,$numSerie) ;
00527
00528 p("texte") ;
00529 echo "La fusion horizontale de données de même structure est réalisée par " ;
00530 echo hrrr("cbind","","rbind()") ;
00531 echo " alors que la fusion verticale de données avec les mêmes identifiants de ligne est réalisée par " ;
00532 echo hrrr("cbind").". " ;
00533 echo " On notera que ".b("cbind()")." produit une matrice, ce qui force souvent l'affichage en colonne, ce qui est bien pratique " ;
00534 echo " et que la fonction ".hrrr("names")." se comporte dans certains cas comme ".hrrr("colnames").". " ;
00535 finp() ;
00536
00537 entree_R("bind.r") ;
00538 sortie_R("bind_sor.txt") ;
00539
00540
00541 p("texte") ;
00542 echo "En cas d'erreur sur les structures, $R affiche des messages pas toujours compréhensibles :" ;
00543 finp() ;
00544
00545 entree_R("bind_err.txt") ;
00546
00547 p("texte") ;
00548 echo "La fusion générale se fait sur clé d'appariement via " ;
00549 echo hrrr("merge").". " ;
00550 echo " Il y a bien sûr des options pour préciser cette clé, ce qu'il faut faire des données orphelines " ;
00551 echo " à droite et à gauche... " ;
00552 finp() ;
00553
00554 sortie_R("lesmerge_sor.txt") ;
00555
00556 finsolution() ;
00557
00558 finblockquote() ;
00559
00560 ## -------------------------------------------------------------------------------------------
00561
00562 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Indiçage, filtrage et sélection de données"
00563
00564 ## -------------------------------------------------------------------------------------------
00565
00566 blockquote() ;
00567
00568 blockquote() ;
00569
00570 p("texte") ;
00571 echo "Comment obtenir la valeur du n-ième élément d'une structure ? le maximum ? que les valeurs positives ? " ;
00572 finp() ;
00573
00574
00575 finblockquote() ;
00576
00577 solution($numExo,$numSerie) ;
00578
00579 p("texte") ;
00580 echo "L'indexation avec les crochets droits [ et ] permet de désigner le n-ième élément d'une structure. " ;
00581 echo " Un seul indice suffit pour les vecteurs alors qu'il en faut deux pour les matrices, séparés par une virgule. " ;
00582 echo " Pour les listes, on peut utiliser les crochets simples ou doubles. Dans le premier cas, la structure de liste est " ;
00583 echo " conservée. " ;
00584 finp() ;
00585
00586 entree_R("indexation.r") ;
00587 sortie_R("indexation_sor.txt") ;
00588
00589 p("texte") ;
00590 echo "Pour trouver le maximum d'une structure, on utilise en général la fonction " ;
00591 echo hrrr("Extremes","","max()") ;
00592 echo ", mais qu'on applique différemment suivant les structures. " ;
00593 echo " Pour un vecteur et une matrice, ".b("max()")." renvoie le maximum de tous les éléments rencontrés. " ;
00594 echo " Si on veut les maxima en ligne ou en colonne, il faut utiliser ".b("apply(max...")." en indiquant la " ;
00595 echo " marge (MARGIN) : 1 pour les lignes et 2 pour les colonnes. Pour une liste qui contient seulement des " ;
00596 echo " vecteurs ou des matrices, ".b("lapply(max...")." et ".b("sapply(max...")." sont des solutions acceptables. " ;
00597 echo " S'il y a des listes dans la liste, il faut forcer un appel récursif avec ".b("rapply(max...").". " ;
00598 finp() ;
00599
00600 p("texte") ;
00601 echo " La position du maximum s'obtient avec " ;
00602 echo hrrr("which.min","","which.max()") ;
00603 echo " mais ne renvoie qu'une seule position. Un test direct avec ".b("==max(...")." permet de trouver toutes les " ;
00604 echo " positions du maximum, si on applique son résultat aux indices de la structure." ; # à laquelle on l'applique. " ;
00605 echo " Tout test logique sur une structure permet de filtrer une structure. Voir ci-dessous. " ;
00606 echo " Au passage, on notera que " ;
00607 echo hrrr("which.min","","which.max()")." est une forme particulière de " ;
00608 echo hrrr("which")."." ;
00609 finp() ;
00610
00611 entree_R("lesmax.r") ;
00612 sortie_R("lesmax_sor.txt") ;
00613
00614 finsolution() ;
00615
00616 finblockquote() ;
00617
00618 ## -------------------------------------------------------------------------------------------
00619
00620 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Conversion de structures de données en $R
00621
00622 ## -------------------------------------------------------------------------------------------
00623
00624 blockquote() ;
00625
00626 blockquote() ;
00627 p("texte") ;
00628 echo " Quelles sont les différentes structures de données en $R et comment passe-t-on des unes aux autres ?" ;
00629 finp() ;
00630 finblockquote() ;
00631
00632 solution($numExo,$numSerie) ;
00633
00634 p("texte") ;
00635 echo "Les principales structures de données élémentaires sont les listes, les vecteurs, les matrices et les \"data frames\", construites directement par " ;
00636 echo hrrr("list").", " ;
00637 echo hrrr("vector").", " ;
00638 echo hrrr("matrix")." et " ;
00639 echo hrrr("data.frame")." ou indirectement par des fonctions comme " ;
00640 echo hrrr("seq").", " ;
00641 echo hrrr("rep").", " ;
00642 echo hrrr("range").", " ;
00643 echo hrrr("which")."... " ;
00644 finp() ;
00645
00646 p("texte") ;
00647 echo "Les passerelles sont construites avec ".b("\"as\".")." comme " ;
00648 echo hrrr("vector","","as.vector()").", " ;
00649 echo hrrr("matrix","","as.matrix()").", " ;
00650 echo hrrr("list","","as.list()").", " ;
00651 echo hrrr("as.data.frame")."... " ;
00652 echo " mais aussi avec " ;
00653 echo hrrr("unlist").". " ;
00654 finp() ;
00655
00656 p("texte") ;
00657 echo "On connait souvent le type d'une variable à l'aide de la fonction " ;
00658 echo hrrr("class").", même si certains objets peuvent hériter de plusieurs classes. " ;
00659 finp() ;
00660
00661 entree_R("classes.r") ;
00662 sortie_R("classes.sor") ;
00663
00664 p("text") ;
00665 echo "De façon plus fine, les data frames sont des listes. Les matrices peuvent avoir des " ;
00666 echo hrrr("colnames","","rownames") ;
00667 echo " et des " ;
00668 echo hrrr("colnames"). " (sans point) " ;
00669 echo " alors que les listes peuvent avoir des " ;
00670 echo hrrr("names"). " et que les data frames peuvent avoir des " ;
00671 echo hrrr("row.names")." (avec un point), des " ;
00672 echo hrrr("names"). ". " ;
00673 finp() ;
00674
00675 entree_R("names.r") ;
00676 sortie_R("names_sor.txt") ;
00677
00678 p("texte") ;
00679 echo b("Rappel : ") ;
00680 echo "il y a coercion de type pour les vecteurs et les matrices, c'est-à-dire que $R contraint les éléments à être de " ;
00681 echo " même type. " ;
00682 finp() ;
00683
00684 entree_R("coercion.r") ;
00685 sortie_R("coercion.sor") ;
00686
00687 finsolution() ;
00688
00689 finblockquote() ;
00690
00691 ## -------------------------------------------------------------------------------------------
00692
00693 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Gestion des données manquantes
00694
00695 ## -------------------------------------------------------------------------------------------
00696
00697 blockquote() ;
00698
00699 blockquote() ;
00700 p("texte") ;
00701 echo "Il arrive quand on importe des données, qu'il ait des \"trous\", ce qui aboutit à des données manquantes." ;
00702 echo " Comment fait-on pour les gérer en R ?" ;
00703 finp() ;
00704
00705 p("texte") ;
00706 echo " Y a-t-il un impact sur les calculs ?" ;
00707 finp() ;
00708
00709 finblockquote() ;
00710
00711 solution($numExo,$numSerie) ;
00712
00713
00714 p("texte") ;
00715 echo "Oui, malheureusement les valeurs " ;
00716 echo hrrr("NA","","NA")." (".em("not available")." en anglais) ont un fort impact sur les calculs. " ;
00717 echo " Les NA empêchent de calculer les sommes, donc les moyennes, les variances... " ;
00718 echo " De plus un test logique avec NA renvoie NA, ce n'est pas très pratique !" ;
00719 echo " Pour les chaines de caractères, les données manquantes sont notées ".em("<NA>").". " ;
00720 finp() ;
00721
00722 entree_R("nadata.r") ;
00723 sortie_R("nadata_sor.txt") ;
00724
00725 p("texte") ;
00726 echo "Face à plusieurs NA dans une matrice ou un data frame, il y a plusieurs stratégies. " ;
00727 sdl() ;
00728 echo " Soit on supprime toutes les lignes avec des NA à l'aide de " ;
00729 echo hrrr("na.fail","stats","na.omit()") ;
00730 echo " et on peut alors utiliser toutes les fonctions directement, y compris " ;
00731 echo hrrr("colSums")." et " ;
00732 echo hrrr("colSums","base","colMeans()").", soit on utilise les fonctions avec le paramètre " ;
00733 echo b("na.rm=TRUE").". " ;
00734 sdl() ;
00735 echo "La première stratégie élimine parfois trop de données. Voir un exemple détaillé avec la " ;
00736 echo href("../Eda/edacrs.php?n=6&m=e","question 1","grouge")." de notre cours " ;
00737 echo href("../Eda/eda.php","EDA","gbleuf")." et sa " ;
00738 echo href("../Eda/edacrs.php?n=6&m=s","solution","gvert")." détaillée avec la discussion sur les NA. " ;
00739 finp() ;
00740
00741 # sortie_R("namatdata_sor.txt") ;
00742
00743 finsolution() ;
00744
00745 finblockquote() ;
00746
00747 ## -------------------------------------------------------------------------------------------
00748
00749 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Export de données
00750
00751 ## -------------------------------------------------------------------------------------------
00752
00753 blockquote() ;
00754
00755 blockquote() ;
00756 p("texte") ;
00757 echo "Comment faire pour exporter un ".em("data frame")." dans un fichier-texte ?" ;
00758 echo " Et dans un fichier Excel (Open Office Calc) ?" ;
00759 echo " Et au format LaTeX ?" ;
00760 finp() ;
00761
00762 p("texte") ;
00763 echo " Et dans une page Web ?" ;
00764 echo " Et au format Word (Open Office Write) ?" ;
00765 finp() ;
00766
00767 p("texte") ;
00768 echo " Et si ce n'est pas un ".em("data frame")." mais juste une liste de calculs, ou un vecteur ? " ;
00769 finp() ;
00770 finblockquote() ;
00771
00772 solution($numExo,$numSerie) ;
00773
00774 p("texte") ;
00775 echo "De la même façon qu'on utilise " ;
00776 echo hrrr("read.table","utils")." et consor, soit " ;
00777 echo hrrr("read.table","utils","read.csv()")." et " ;
00778 echo hrrr("read.table","utils","read.csv2()") ;
00779 echo " en entrée, on dispose de " ;
00780 echo hrrr("write.table","utils")." en sortie, avec ses avatars " ;
00781 echo hrrr("write.table","utils","write.csv()")." et " ;
00782 echo hrrr("write.table","utils","write.csv2()").". " ;
00783 finp() ;
00784
00785 p("texte") ;
00786 echo "L'utilisation du package " ;
00787 echo hrrp("R2HTML")." est d'une grande simplicité pour générer du code HTML " ;
00788 echo "(le fichier produit est ".href("dynamic_main.html","ici")." :" ;
00789 finp() ;
00790
00791 entree_R("r2html.r") ;
00792
00793 p("texte") ;
00794 echo "De plus ce package " ;
00795 echo hrrp("R2HTML")." contient peu de fonctions :" ;
00796 finp() ;
00797
00798 pre_fichier("lls_r2html.sor","cadre") ;
00799
00800 p("texte") ;
00801 echo "Il faut juste regretter que le code produit ne soit pas XHTML valide, que ce soit pour la " ;
00802 echo " grammaire ".em("Strict")." ou ".em("Trans").", mais cela fournit déjà une base sérieuse de code HTML." ;
00803 echo " Dans la mesure où ".b("Microsoft Word")." et ".b("Open Office Write")." savent lire les fichiers HTML pour en faire des documents de traitement de texte, " ;
00804 echo " produire du HTML est suffisant pour produire du Word, dans un premier temps." ;
00805 finp() ;
00806
00807 p("texte") ;
00808 echo "Un autre package qui permet de créer du HTML est " ;
00809 echo hrrp("hwriter")." et ses fonctions " ;
00810 echo hrrr("openPage","hwriter").", " ;
00811 echo hrrr("hwrite","hwriter")." et " ;
00812 echo hrrr("openPage","hwriter","closePage").". Le code est produit est XHTML valide pour la grammaire ".em("Trans")." :" ;
00813 finp() ;
00814
00815 entree_R("hwr.r") ;
00816
00817 p("texte") ;
00818 echo "Le fichier produit est ".href("demoHwriter.html").". " ;
00819 echo " On peut s'affranchir du texte de création en base de page avec le paramètre ".b("splash")." dans " ;
00820 echo hrrr("openPage","hwriter","closePage").". " ;
00821 echo "Pour aller encore plus loin avec les exports, le package " ;
00822 echo hrrp("hwriterPlus")." est une extension intéressante de " ;
00823 echo hrrp("hwriter").". " ;
00824 finp() ;
00825
00826 p("texte") ;
00827 echo "Pour produire du code LaTeX, on peut utiliser le package " ;
00828 echo hrrp("xtable")." et sa fonction " ;
00829 echo hrrr("xtable","xtable")." " ;
00830 echo " ou le package " ;
00831 echo hrrp("Hmisc")." et sa fonction " ;
00832 echo hrrr("latex","Hmisc")." qui a l'avantage de créer un fichier de même nom que la structure, soit ici " ;
00833 echo href("trees.tex")." (copie locale en .txt " ;
00834 echo href("trees.tex.txt","ici")."). " ;
00835 finp() ;
00836
00837 entree_R("latex.r") ;
00838 sortie_R("latex_sor.txt") ;
00839
00840 finsolution() ;
00841
00842 finblockquote() ;
00843
00844 ## -------------------------------------------------------------------------------------------
00845
00846 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # $R et SQL
00847
00848 ## -------------------------------------------------------------------------------------------
00849
00850 blockquote() ;
00851
00852 p("texte") ;
00853 echo "Peut-on et faut-il interfacer $R et SQL ?" ;
00854 finp() ;
00855
00856 solution($numExo,$numSerie) ;
00857
00858 p("texte") ;
00859 echo "Oui et non. Oui, car on peut interfacer $R et SQL, mais non parce qu'à notre avis au moins dans un premier temps il vaut " ;
00860 echo "mieux séparer les activités. D'autant que la connectivité via ".hrrp("RODBC")." ou ".hrrp("DBI").", par exemple, demande des installations techniques... " ;
00861 echo " Dans la mesure où $R sait bien lire les fichiers-texte, le mieux est d'exporter les données SQL qui sont presque toujours, " ;
00862 echo " obtenues par la commande ".href("../../tuteurs/tutmysql.htm","SELECT","grouge")." donc qui correspond à un \"beau\" tableau rectangulaire lisible " ;
00863 echo " par ".hrrr("read.table","utils")." du package ".hrrp("utils").". " ;
00864 finp() ;
00865
00866 finsolution() ;
00867
00868 finblockquote() ;
00869
00870 ## -------------------------------------------------------------------------------------------
00871
00872 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Présentation des packages base, gdata, foreign, tools et utils
00873
00874 ## -------------------------------------------------------------------------------------------
00875
00876 blockquote() ;
00877
00878 p("texte") ;
00879 echo "Que contiennent les packages base, gdata, tools et utils ?" ;
00880 finp() ;
00881
00882 p("texte") ;
00883 echo "Quelles en sont les fonctions les plus importantes ?" ;
00884 echo " Quels jeux de données sont fournis par ces packages ?" ;
00885 finp() ;
00886
00887 solution($numExo,$numSerie) ;
00888
00889 p("texte") ;
00890 echo "La fonction " ;
00891 echo hrrr("ls")." liste les objets de l'environnement courant, mais elle peut aussi indiquer les objets dans un " ;
00892 echo " package, lorsqu'il est chargé. Le résultat pour le package " ;
00893 echo hrrp("base")." est sans appel :" ;
00894 echo " avec 1167 objets dont 1162 fonctions, il est illusoire de penser connaitre ce package en quelques minutes. " ;
00895 echo " Les autres packages cités sont relativement moins importants. " ;
00896 finp() ;
00897
00898 entree_R("lsp.r") ;
00899 sortie_R("lsp.sor") ;
00900
00901 p("texte") ;
00902 echo "On trouvera dans le tableau suivant des liens " ;
00903 echo "vers la liste des objets de ces packages." ;
00904 finp() ;
00905
00906 blockquote() ;
00907 table(1,15,"collapse") ;
00908 entetesTableau("Package Nb_objets Lien","bleu_pastel") ;
00909 $ldp = preg_split("/\s+/","base gdata tools utils") ;
00910 $nbo = preg_split("/\s+/","1167 64 97 198") ;
00911 $ido = -1 ;
00912 foreach ($ldp as $pkg) {
00913 $ido++ ;
00914 tr() ;
00915 td("","tagris") ; echo $pkg ; fintd() ;
00916 td("R","tajaunec") ; echo $nbo[$ido]." " ; fintd() ;
00917 $fic = "lls_".$pkg.".sor" ;
00918 td("","tarose") ; echo href($fic,"","grouge nou") ; fintd() ;
00919 fintr() ;
00920 } # fin pour ;
00921 fintable() ;
00922 finblockquote() ;
00923
00924 p("texte") ;
00925 echo "Dans le package " ;
00926 echo hrrp("utils").", les principales fonctions à connaitre sont certainement les suivantes, regroupées par thème :" ;
00927 finp() ;
00928
00929 blockquote() ;
00930 table(1,15,"collapse") ;
00931 entetesTableau("Thème Fonctions","bleu_pastel") ;
00932 $ldt = preg_split("/\s+/","aide packages web affichage fichiers") ;
00933 foreach ($ldt as $them) {
00934 $ido++ ;
00935 tr() ;
00936 td("","tagris") ; echo $them ; fintd() ;
00937 td("","tajaunec") ;
00938 if ($them=="aide") {
00939 echo " ".hrrr("apropos","utils")." " ;
00940 echo " ".hrrr("browseVignettes","utils")." " ;
00941 echo " ".hrrr("help","utils")." " ;
00942 echo " ".hrrr("help.search","utils")." " ;
00943 echo " ".hrrr("help.start","utils")." " ;
00944 echo " ".hrrr("RSiteSearch","utils")." " ;
00945 echo " ".hrrr("vignette","utils")." " ;
00946 } # fin si
00947 if ($them=="packages") {
00948 echo " ".hrrr("install.packages","utils")." " ;
00949 echo " ".hrrr("installed.packages","utils")." " ;
00950 echo " ".hrrr("update.packages","utils")." " ;
00951 } # fin si
00952 if ($them=="web") {
00953 echo " ".hrrr("browseURL","utils")." " ;
00954 echo " ".hrrr("URLencode","utils")." " ;
00955 echo " ".hrrr("URLencode","utils","URLdecode()")." " ;
00956 echo " ".hrrr("url.show","utils")." " ;
00957 } # fin si
00958 if ($them=="affichage") {
00959 echo " ".hrrr("head","utils")." " ;
00960 echo " ".hrrr("ls_str","utils","ls.str()")." " ;
00961 echo " ".hrrr("prompt","utils")." " ;
00962 echo " ".hrrr("str","utils")." " ;
00963 echo " ".hrrr("head","utils","tail()").", " ;
00964 echo " ".hrrr("savehistory","utils","history()")." " ;
00965 } # fin si
00966 if ($them=="fichiers") {
00967 echo " ".hrrr("read.table","utils","read.csv()")." " ;
00968 echo " ".hrrr("read.table","utils","read.csv2()")." " ;
00969 echo " ".hrrr("read.table","utils")." " ;
00970 echo " ".hrrr("write.table","utils","write.csv()")." " ;
00971 echo " ".hrrr("write.table","utils","write.csv2()")." " ;
00972 echo " ".hrrr("write.table","utils")." " ;
00973 } # fin si
00974 fintd() ;
00975 fintr() ;
00976 } # fin pour ;
00977 fintable() ;
00978 finblockquote() ;
00979
00980 p("texte") ;
00981 echo "Dans le package " ;
00982 echo hrrp("gdata").", il faut certainement connaitre les fonctions " ;
00983 echo hrrr("combine","gdata").", " ;
00984 echo hrrr("keep","gdata").", " ;
00985 echo hrrr("ll","gdata").", " ;
00986 echo hrrr("nobs","gdata").", " ;
00987 echo hrrr("rename.vars","gdata").", " ;
00988 echo hrrr("trim","gdata")." " ;
00989 echo " et bien sûr " ;
00990 echo hrrr("read.xls","gdata").". " ;
00991 finp() ;
00992
00993 p("texte") ;
00994 echo "Enfin, dans le package " ;
00995 echo hrrp("tools").", il faut certainement connaitre les fonctions " ;
00996 echo hrrr("fileutils","tools","file_ext()").", " ;
00997 echo hrrr("HTMLheader","tools","").", " ;
00998 echo hrrr("Rd2HTML","tools","").", " ;
00999 echo hrrr("showNonASCII","tools","").", " ;
01000 echo hrrr("toHTML","tools","").". " ;
01001 finp() ;
01002
01003
01004 p("texte") ;
01005 echo "Il n'y a aucun jeu de données dans les packages ";
01006 echo hrrp("tools") ;
01007 echo " et " ;
01008 echo hrrp("utils").". " ;
01009 echo "Il n'y a plus aucun jeu de données dans le package " ;
01010 echo hrrp("base")." " ;
01011 echo " parce qu'ils ont tous été transférés dans le package " ;
01012 echo hrrp("datasets").". Voici les jeux de données présents dans ce package (version juillet 2013) :" ;
01013 finp() ;
01014
01015 sortie_R("datasets_sor.txt") ;
01016
01017
01018 p("texte") ;
01019 echo "Le package " ;
01020 echo hrrp("gdata")." contient un seul jeu de données, " ;
01021 echo b("MedUnist").", dont l'aide indique " ;
01022 echo em("«Table of conversions between Intertional Standard (SI) and US 'Conventional' Units for common medical measurements.»") ;
01023 echo ". Le contenu de cette table de conversion est " ;
01024 echo href("medunits_sor.txt","ici").". " ;
01025 finp() ;
01026
01027 p("texte") ;
01028 echo "Le package " ;
01029 echo hrrp("foreign")." est intéressant parce que ses fonctions lisent (et écrivent parfois) les fichiers de données " ;
01030 echo " des autres grands logiciels statistiques comme Sas, Spss.. " ;
01031 finp() ;
01032
01033 sortie_R("lls_foreign_sor.txt") ;
01034
01035 finsolution() ;
01036
01037 finblockquote() ;
01038
01039
01040 ## -------------------------------------------------------------------------------------------
01041
01042 finPageExercices($numSerie) ; # contient finSection() et finPage() ; la fonction est dans intror_inc.php
01043
01044 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)