Listing du fichier progie6.php
00001 <?php
00002 # # (gH) -_- progie6.php ; TimeStamp (unix) : 16 Février 2015 vers 21:26
00003
00004 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00005
00006 include_once("std7.php") ;
00007 include_once("progi.php") ;
00008 include_once("statuno7.php") ;
00009
00010 $R = s_span("R","gbleuf") ;
00011 $numSerie = 6 ;
00012 debutPageExercices($numSerie) ;
00013
00014 ## -------------------------------------------------------------------------------------------
00015
00016 p("texte") ;
00017 echo "" ;
00018 finp() ;
00019 debutSection() ;
00020
00021 $tableauDesRubriques = array() ;
00022 $idr = 0 ;
00023
00024 $idr++; $tableauDesRubriques[$idr] = "Actions sur une liste de fichiers" ;
00025 $idr++; $tableauDesRubriques[$idr] = "Transformations dans un data frame" ;
00026 $idr++; $tableauDesRubriques[$idr] = "Positions dans une structure" ;
00027 $idr++; $tableauDesRubriques[$idr] = "Barre de progression" ;
00028 $idr++; $tableauDesRubriques[$idr] = "Documenter la fin de fonction" ;
00029 $idr++; $tableauDesRubriques[$idr] = "Export de résultats pour publication ou démonstration" ;
00030 $idr++; $tableauDesRubriques[$idr] = "Passer des boucles POUR aux fonctions *APPLY (ou autres)" ;
00031
00032 $tdmCRLM = new tdm($tableauDesRubriques) ;
00033 $tdmCRLM->titre() ;
00034 $tdmCRLM->menu("oui","oui","nou") ;
00035
00036 afficherSolutions($numSerie) ;
00037
00038 finSection() ;
00039
00040 debutSection() ;
00041 $numExo = 0 ;
00042
00043 ## -------------------------------------------------------------------------------------------
00044
00045 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Actions sur une liste de fichiers
00046
00047 ## -------------------------------------------------------------------------------------------
00048
00049 blockquote() ;
00050
00051 blockquote() ;
00052
00053 p("texte") ;
00054 echo "On veut exécuter une même action sur une série de fichiers. " ; # par exemple leur appliquer la fonction " ;
00055 #echo b("process(nomFic)")." qui se contente d'afficher le nom du fichier (texte) et le nombre de lignes du fichier " ;
00056 #echo " (on renverra ces nombres de lignes en sortie de fonction). " ;
00057 echo " Comment implémenter cela en $R ?" ;
00058 echo " Et avec un affichage comme :" ;
00059 finp() ;
00060
00061 pre_fichier("actfic1.txt","cadre") ;
00062
00063 finblockquote() ;
00064
00065 solution($numExo,$numSerie) ;
00066
00067 p("texte") ;
00068 echo "Pour ce qui suit, nous allons réduire l'action à exécuter sur le fichier au simple affichage de son nom." ;
00069 echo " On admettra donc que le traitement d'un fichier est réalisé par la fonction suivante :" ;
00070 finp() ;
00071
00072 pre_fichier("action1.r","cadrebleu") ;
00073
00074 p("texte") ;
00075 echo "Pour traiter une liste de fichiers comme celle indiquée, il pourrait être tentant d'écrire une " ;
00076 echo " boucle POUR à partir de la liste des fichiers, soit le code :" ;
00077 finp() ;
00078
00079 pre_fichier("action2.r","cadrebleu") ;
00080
00081 p("texte") ;
00082 echo "D'où l'affichage :" ;
00083 finp() ;
00084
00085 pre_fichier("action2.res","cadrejaune") ;
00086
00087 p("texte") ;
00088 echo "Ce n'est certainement pas la seule solution. Elle oblige à programmer une boucle, alors " ;
00089 echo " qu'on peut se contenter d'écrire le code :" ;
00090 finp() ;
00091
00092 pre_fichier("action3.r","cadrebleu") ;
00093
00094 p("texte") ;
00095 echo "dont l'affichage est :" ;
00096 finp() ;
00097
00098 pre_fichier("action3.res","cadrejaune") ;
00099
00100 p("texte") ;
00101 echo "Si maintenant on veut absolument un affichage comme ".b("fichier xx/yy")." il est " ;
00102 echo " possible d'écrire, toujours sans boucle :" ;
00103 finp() ;
00104
00105 pre_fichier("action4.r","cadrebleu") ;
00106
00107 finsolution() ;
00108
00109 finblockquote() ;
00110
00111 ## -------------------------------------------------------------------------------------------
00112
00113 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations dans un data frame
00114
00115 ## -------------------------------------------------------------------------------------------
00116
00117 blockquote() ;
00118
00119 blockquote() ;
00120
00121 p("texte") ;
00122 echo "Comment fait-on en $R pour convertir des données dans un data frame ?" ;
00123 echo " Par exemple, comment convertir les unités américaines dans le système métrique pour les " ;
00124 echo " données ".b("height").", ".b("weight")." et ".b("waist")." des données " ;
00125 echo href("diabetes.dar","DIABETES")." ?" ; ;
00126 finp() ;
00127
00128 finblockquote() ;
00129
00130 solution($numExo,$numSerie) ;
00131
00132 p("texte") ;
00133 echo "La réponse tient en un seul mot : il s'agit de " ;
00134 echo lafonction("transform").". Voici ce qu'on pourrait naivement écrire, si on ne connaissait pas cette fonction :" ;
00135 finp() ;
00136
00137 pre_fichier("transform1.r","cadrebleu") ;
00138
00139 p("texte") ;
00140 echo "Et bien sûr la \"bonne\" solution, plus concise avec " ;
00141 echo lafonction("transform")." :" ;
00142 finp() ;
00143
00144 pre_fichier("transform2.r","cadrebleu") ;
00145
00146
00147 p("texte") ;
00148 echo "Pour des transformations plus sophistiquées, par exemple si on veut utiliser dans la foulée des colonnes tout juste créees, on peut " ;
00149 echo " passer par la fonction ".hrrr("mutate","plyr")." du package ".hrrp("plyr")."." ;
00150 finp() ;
00151
00152 finsolution() ;
00153
00154 finblockquote() ;
00155
00156 ## -------------------------------------------------------------------------------------------
00157
00158 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Positions dans une structure
00159
00160 ## -------------------------------------------------------------------------------------------
00161
00162 blockquote() ;
00163
00164 blockquote() ;
00165
00166 p("texte") ;
00167 echo "Quelle est la façon la plus efficace en $R pour trouver les positions d'éléments remarquables ?" ;
00168 echo " Par exemple pour trouver les positions du minimum, ou les valeurs plus grandes que la moyenne plus deux écart-types ?" ;
00169 finp() ;
00170
00171 finblockquote() ;
00172
00173 solution($numExo,$numSerie) ;
00174
00175 p("texte") ;
00176 echo "Nous avons déjà vu et expliqué ce genre de problème et la réponse est le ".rouge("filtrage vectoriel").". " ;
00177 echo " Voici par exemple comment compter combien de valeurs sont supérieures à la moyenne :" ;
00178 finp() ;
00179
00180 pre_fichier("filtrage1.res","cadrejaune") ;
00181
00182 finsolution() ;
00183
00184 finblockquote() ;
00185
00186 ## -------------------------------------------------------------------------------------------
00187
00188 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Barre de progression
00189
00190 ## -------------------------------------------------------------------------------------------
00191
00192 blockquote() ;
00193
00194 blockquote() ;
00195
00196 p("texte") ;
00197 echo "Comment implémenter une barre de progression en $R ?" ;
00198 finp() ;
00199
00200 finblockquote() ;
00201
00202 solution($numExo,$numSerie) ;
00203
00204 p("texte") ;
00205 echo "Ceci est un problème simple et classique. Il est donc normal qu'il y ait plusieurs solutions en R " ;
00206 echo " et il ne faut pas passer de temps à essayer de programmer cela. " ;
00207 echo " On pourra s'en " ;
00208 echo " convaincre à l'aide de la commande " ;
00209 echo b('RSiteSearch("progress bar")').". La page Web associée est " ;
00210 echo href("http://search.r-project.org/cgi-bin/namazu.cgi?query=progress+bar&max=20&result=normal&sort=score&idxname=functions&idxname=vignettes&idxname=views","ici").". " ;
00211 finp() ;
00212
00213 p("texte") ;
00214 echo "Parmi les dizaines de réponses, nous en retiendrons deux, \n" ;
00215 echo "celle du package ".hrrp("utils")." nommée ".hrrr("txtProgressBar","utils")." et \n" ;
00216 echo "celle du package ".hrrp("tcltk")." nommée ".hrrr("tkProgressBar","tcltk").". \n" ;
00217 finp() ;
00218
00219 p("texte") ;
00220 echo "Prenons tout d'abord quelque chose d'un peu long à calculer : \n" ;
00221 finp() ;
00222
00223 pre_fichier("progressb01.r","cadre") ;
00224
00225 p("texte") ;
00226 echo "Et voyons comment afficher une barre de progression \n" ;
00227 echo "sur 50 caractères \"égal\". Nous commençons par afficher une ligne d'étoiles de la \n" ;
00228 echo "même longueur que la barre de progression : \n" ;
00229 finp() ;
00230
00231 pre_fichier("progressb02.r","cadre") ;
00232
00233 p("texte") ;
00234 echo "Voici ce qui est affiché au bout de 10 secondes si on exécute \n" ;
00235 finp() ;
00236
00237 pre_fichier("progressb02.txt","cadre") ;
00238
00239 p("texte") ;
00240 echo "Les barres de progression affichées par ".hrrr("tkProgressBar","tcltk")." sont des fenêtres à part et qui n'apparaissent pas \n" ;
00241 echo "dans la sortie console. En voici un exemple, inspiré, ".em("bien sûr")." de ".b("example(tkProgressBar)")." \n" ;
00242 echo "sachant que la syntaxe de la fonction ".hrrr("tkProgressBar","tcltk")." \n" ;
00243 echo "est très similaire à celle de la fonction ".hrrr("txtProgressBar","utils")." : \n" ;
00244 finp() ;
00245
00246 pre_fichier("progress03.r","cadre") ;
00247
00248 p("texte") ;
00249 echo "Voici ce qui est affiché au bout de 10 secondes :" ;
00250 finp() ;
00251
00252 # \includegraphics[width=14cm]{progress03.png
00253
00254 $img = "progress03.png" ;
00255 p() ;
00256 nbsp(20) ;
00257 echo href($img,img($img,"",600)) ;
00258 finp() ;
00259
00260 p("texte") ;
00261 echo b("Conclusion :")." il y a très souvent dans les packages $R tout ce qu'on veut comme solution technique \n" ;
00262 echo "à un problème classique ou fréquent. \n" ;
00263 finp() ;
00264
00265 finsolution() ;
00266
00267 finblockquote() ;
00268
00269 ## -------------------------------------------------------------------------------------------
00270
00271 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Documenter la fin de fonction
00272
00273 ## -------------------------------------------------------------------------------------------
00274
00275 blockquote() ;
00276
00277 blockquote() ;
00278
00279 p("texte") ;
00280 echo "Vous avez déjà vu dans nos codes-source les fins de fonctions \n" ;
00281 echo "documentées comme ceci : \n" ;
00282 finp() ;
00283
00284 pre_fichier("finfonc.txt","cadre") ;
00285
00286 p("texte") ;
00287 echo "A quoi cela peut-il servir ? \n" ;
00288 finp() ;
00289
00290 p("texte") ;
00291 echo "Est-ce simple d'écrire une fonction qui utilise un paramètre qui correspond \n" ;
00292 echo "à un nom de fichier script au sens de $R et en affiche la liste des fonctions \n" ;
00293 echo "avec le numéro de ligne du début de fonction \n" ;
00294 echo "comme dans \n" ;
00295 finp() ;
00296
00297 pre_fichier("listefonc.txt","cadre") ;
00298
00299 p("texte") ;
00300 echo " Comment utiliser cette fonction dans le terminal sans passer par Rstudio ?" ;
00301 finp() ;
00302
00303 finblockquote() ;
00304
00305 solution($numExo,$numSerie) ;
00306
00307 p("texte") ;
00308 echo "Ecrire explicitement ".noir("# fin de fonction").", comme écrire \n" ;
00309 echo "".noir("# fin si")." ou \n" ;
00310 echo "".noir("# fin pour")." \n" ;
00311 echo "rend le code-source beaucoup plus lisible pour un être humain (l'interpréteur \n" ;
00312 echo " $R, lui, utilise d'autres règles pour \"lire\" et \"comprendre\" le code). \n" ;
00313 finp() ;
00314
00315 p("texte") ;
00316 echo "Il est sûr que quand on lit un code comme \n" ;
00317 finp() ;
00318
00319 pre_fichier("cmt01.txt","cadre") ;
00320
00321 p("texte") ;
00322 echo "ou \n" ;
00323 finp() ;
00324
00325 pre_fichier("cmt02.txt","cadre") ;
00326
00327 p("texte") ;
00328 echo "on ne sait pas explicitement quelle structure se termine. C'est pourquoi nous vous conseillons \n" ;
00329 echo "d'écrire \n" ;
00330 finp() ;
00331
00332 pre_fichier("cmt03.txt","cadre") ;
00333
00334 p("texte") ;
00335 echo "même si certains éditeurs de textes sont capables d'auto-indenter le code-source. \n" ;
00336 finp() ;
00337
00338 p("texte") ;
00339 echo "Documenter la fin de fonction rend aussi plus facile la recherche des fonctions dans un \n" ;
00340 echo "texte par programme. C'est pourquoi nous écrivons ".noir("# fin fonction xxx")." et non pas \n" ;
00341 echo "".noir("# end function").". Cela permet de pouvoir fournir facilement dans une page Web juste le code de la \n" ;
00342 echo "fonction, comme par exemple pour l'interface de ".b("statghfns")." : \n" ;
00343 finp() ;
00344
00345
00346 p("texte") ;
00347 nbsp(15) ;
00348 echo href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php","","bouton_fin nou bleu_pastel") ;
00349 finp() ;
00350
00351 p("texte") ;
00352 echo "Si on respecte un minimum de convention d'écriture comme par exemple \n" ;
00353 echo "mettre le début et la fin de fonction sur une seule ligne, produire une liste des fonctions \n" ;
00354 echo "comme celle demandée consiste juste à savoir détecter les expressions ".noir("<- function")." \n" ;
00355 echo "et ".noir("# fin fonction").". \n" ;
00356 echo "Heureusement, $R dispose de fonctions pour cela. \n" ;
00357 finp() ;
00358
00359 p("texte") ;
00360 echo "Ainsi, avec la fonction ".hrrr("grep")." du package ".hrrp("base").", on peut facilement trouver les numéros de lignes. \n" ;
00361 finp() ;
00362
00363 p("texte") ;
00364 echo "Il suffit d'écrire, après la lecture du fichier par ".noir("lignes <- readLines(fichier)")." \n" ;
00365 finp() ;
00366
00367 pre_fichier("grep01.r","cadre") ;
00368
00369 p("texte") ;
00370 $bs = "\\";
00371 $pg = "(";
00372 echo "L'expression régulière utilisée ici ".noir("\"<-".$bs.$bs."s+function".$bs.$bs."$pg\"")." est un tout petit peu plus compliquée \n" ;
00373 echo "que la simple chaine ".noir("\"<- function\"")." \n" ;
00374 echo "car \n" ;
00375 finp() ;
00376
00377 ul() ;
00378
00379 debutli() ; p() ;
00380 echo "il peut y avoir plusieurs espaces entre ".noir("<-")." et ".noir("function")." \n" ;
00381 echo "d'où la partie ".noir("\\s+")." ; \n" ;
00382 finp() ; finli() ;
00383
00384 debutli() ; p() ;
00385 echo "pour saisir un \"slash\" dans une expression régulière, il faut doubler ce symbole, d'où ".noir("\\\\s+")." ; \n" ;
00386 finp() ; finli() ;
00387
00388 debutli() ; p() ;
00389 echo "pour saisir une parenthèse dans une expression régulière, il faut la faire précéder d'un \"slash\" qui doit lui-même \n" ;
00390 echo "être doublé d'où ".noir("\\\\(").". \n" ;
00391 finp() ; finli() ;
00392
00393 finul() ;
00394
00395 p("texte") ;
00396 echo "Si de plus on utilise le paramètre ".noir("value")." avec la valeur ".noir("TRUE")." dans l'appel de " ;
00397 echo " la fonction ".hrrr("grep") ;
00398 echo ", $R renvoie la chaine détectée. Voici ce qu'on \n" ;
00399 echo "peut donc facilement obtenir avec $R juste avec ".noir("grep()")."et l'expression régulière : \n" ;
00400 finp() ;
00401
00402 pre_fichier("grep02.txt","cadre") ;
00403
00404 p("texte") ;
00405 echo "Au niveau de la deuxième expression régulière, nous avons ajouté ".noir(".*")." devant ".noir("<-")." afin de récupérer le nom de la fonction. \n" ;
00406 finp() ;
00407
00408 p("texte") ;
00409 echo "Pour terminer l'exercice, il suffit de ne garder que le premier mot de chaque ligne trouvée, ce qu'on peut faire avec une fonction \n" ;
00410 echo "anonyme. Voici donc le texte complet de la fonction qui construit la liste des fonctions d'un fichier-script : \n" ;
00411 finp() ;
00412
00413 pre_fichier("listefonc.r","cadre") ;
00414
00415 p("texte") ;
00416 echo "Le rendu est presque conforme à ce qu'on voulait \n" ;
00417 finp() ;
00418
00419 pre_fichier("listefonc2.txt","cadre") ;
00420
00421 p("texte") ;
00422 echo "au cadrage près des numéros de ligne à droite, ce qu'on peut obtenir \n" ;
00423 echo "facilement avec la fonction ".hrrr("sprintf").". Il manque aussi les parenthèses après le nom des fonctions, ce qu'on réalise très \n" ;
00424 echo "simplement la fonction ".hrrr("paste").". Donc au lieu du ".noir("print()")." en fin de fonction, si on écrit \n" ;
00425 finp() ;
00426
00427 pre_fichier("listefonc2.r","cadre") ;
00428
00429 p("texte") ;
00430 echo "alors le résultat est exactement ce qu'on voulait : \n" ;
00431 finp() ;
00432
00433 pre_fichier("listefonc3.txt","cadre") ;
00434
00435 p("texte") ;
00436 echo "Vous aurez remarqué, bien sûr, qu'il n'y a pas de boucle, car nous n'avons utilisé que des ".b("fonctions vectorielles").". \n" ;
00437 finp() ;
00438
00439 p("texte") ;
00440 echo " Pour utiliser cette fonction dans un terminal, il suffit de passer par la commande R ou la commande Rscript. " ;
00441 echo " Il faut bien sur récupérer le paramètre qui correspond au nom du fichier :" ;
00442 finp() ;
00443
00444 pre_fichier("listefonc4.txt","cadrejaune") ;
00445
00446 p() ;
00447 echo "Fichiers associés : " ;
00448 echo href("listeDesFonctions.r").snbsp(2) ;
00449 echo href("listefonc.r").snbsp(2) ;
00450 echo href("conversions.r")."." ;
00451 finp() ;
00452
00453 finsolution() ;
00454
00455 finblockquote() ;
00456
00457 ## -------------------------------------------------------------------------------------------
00458
00459 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Export de résultats pour publication ou démonstration
00460
00461 ## -------------------------------------------------------------------------------------------
00462
00463 blockquote() ;
00464
00465 blockquote() ;
00466
00467 p("texte") ;
00468 echo "On voudrait produire des calculs en $R et disposer rapidement et de façon reproductible des " ;
00469 echo " résultats numériques et graphiques sans avoir à passer par du copier/coller pour produire les " ;
00470 echo " documents associés. Comment faut-il s'y prendre ?" ;
00471 echo " Et si on a besoin de tirages aléatoires dans les calculs ?" ;
00472 finp() ;
00473
00474 finblockquote() ;
00475
00476 solution($numExo,$numSerie) ;
00477
00478 p("texte") ;
00479 echo "Pour produire des résultats reproductibles, il vaut mieux éviter d'utiliser $R via $rstudio à cause des " ;
00480 echo " variables qui pourraient être dans l'environnement. Il est donc conseillé d'exécuter $R directement. " ;
00481 echo " Si on utilise des valeurs aléatoires, il faut utiliser toujours la même " ;
00482 echo hrrr("Random","","graine").". Voici un exemple d'utilisation :" ;
00483 finp() ;
00484
00485 pre_fichier("alea1.res","cadrebleu") ;
00486
00487
00488 p("texte") ;
00489 echo "En ce qui concerne la production de documents avec les résultats, il est clair que la technique du " ;
00490 echo b("copier/coller")." n'est pas envisageable, de par le nombre et la répétition des manipulations, sans " ;
00491 echo " compter les risques d'erreur. " ;
00492 echo " $R fournit de nombreuses solutions pour produire des documents. " ;
00493 echo href("http://yihui.name/knitr/","knitr")." est sans doute la plus pratique (plutôt que " ;
00494 echo href("https://www.statistik.lmu.de/~leisch/Sweave/","Sweave")."). " ;
00495 echo " Elle s'intègre à du code LaTeX, HTML ou Markdown." ;
00496 finp() ;
00497
00498 p("texte") ;
00499 echo "Imaginons par exemple qu'on veuille rédiger un document qui montre comment tracer la densité d'un mélange de deux lois normales. " ;
00500 echo " Voici la fonction ".b("traceNorms()")." du fichier ".href("alea2.r")." qui réalise ce tracé :";
00501 finp() ;
00502
00503 # norm1 <- rnorm(n=5000, mean = -3, sd = 2)
00504 # norm2 <- rnorm(n=5000, mean = 15, sd = 5)
00505
00506 pre_fichier("alea2.r","cadrebleu") ;
00507
00508 p("texte") ;
00509 echo "Voici maintenant le document nommé ".href("alea.rnw")." au format " ;
00510 echo href("http://rug.mnhn.fr/semin-r/PDF/semin-R_knitr_PBessonneau_240513.pdf","knitr")." qui utilise cette fonction :" ;
00511 finp() ;
00512
00513 pre_fichier("alea.rnw","cadrebleu") ;
00514
00515 p("texte") ;
00516 echo " Dans une session $R, il suffit de charger le package ".b("knitr")." puis d'exécuter " ;
00517 echo " la seule commande ".b('knit("alea.rnw",encoding="UTF-8")') ;
00518 echo " pour produire le fichier ".href("alea.tex").". Via la commande " ;
00519 echo b("pdflatex alea.tex")." on obtient alors le fichier ".href("alea.pdf")."." ;
00520 echo " Facile, non ? " ;
00521 echo " Oui, si on connait déjà ".href("http://fr.wikibooks.org/wiki/LaTeX","LaTeX")."." ;
00522 finp() ;
00523
00524 p("texte") ;
00525 echo "Il serait même possible de créer une page Web pour faire saisir à l'utilisateur les 5 ";
00526 echo " paramètres de la fonction ".b("traceNorms()")." et produire le PDF à la volée, mais c'est une autre histoire, " ;
00527 echo " qui met en jeu trois autres langages, à savoir PHP, HTML et CSS..." ;
00528 finp() ;
00529
00530 p("texte") ;
00531 echo " Pour avoir rapidement une idée des possibilités de Markdown dans $R, le plus simple est d'utiliser Rstudio. " ;
00532 echo " Si on passe par le menu File/New File/R Markdown et si on sauvegarde les informations fournies, disons dans " ;
00533 echo " demo.Rmd, alors l'utilisation de l'icone Knit et de ses options HTML/PDF/Word produit les fichiers demandés..." ;
00534 finp() ;
00535
00536 table(0,20,"collapse") ;
00537 tr() ;
00538 td("C") ;
00539 nbsp(8) ;
00540 fintd() ;
00541 td("C") ;
00542 $img = "knitr1.png" ;
00543 echo href($img,img($img,"",300)) ;
00544 fintd() ;
00545 td("C") ;
00546 $img = "knitr2.png" ;
00547 echo href($img,img($img,"",300)) ;
00548 fintd() ;
00549 fintr() ;
00550 fintable() ;
00551
00552
00553 finsolution() ;
00554
00555 finblockquote() ;
00556
00557 ## -------------------------------------------------------------------------------------------
00558
00559 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Passer des boucles POUR aux fonctions *APPLY
00560
00561 ## -------------------------------------------------------------------------------------------
00562
00563 blockquote() ;
00564
00565 blockquote() ;
00566
00567 p("texte") ;
00568 echo " Le passage en revue des colonnes d'un dataframe se fait facilement avec une boucle POUR, comme ci-dessous. " ;
00569 finp() ;
00570
00571 pre_fichier("revueColonnes1.r","cadrebleu") ;
00572 pre_fichier("revueColonnes1.sor","cadrejaune") ;
00573
00574 p("texte") ;
00575 echo " Remplacer cette boucle POUR par un appel de la fonction SAPPLY via les indices de colonnes. " ;
00576 echo " Trouver ensuite comment utiliser SAPPLY avec les noms de colonnes. " ;
00577 echo " Quel est, hormis la concision, l'intérêt de passer par des fonctions *APPLY ?" ;
00578 finp() ;
00579
00580 p("texte") ;
00581 echo " Comment produire la matrice triangulaire inférieure d'une matrice symétrique ? " ;
00582 echo " On pourra utiliser la fonction " ;
00583 echo hrrr("cor","stats") ;
00584 echo " ou la fonction " ;
00585 echo hrrr("dist","stats") ;
00586 echo " pour générer une telle matrice, comme par exemple :" ;
00587 finp() ;
00588
00589 pre_fichier("cordist.r","cadre") ;
00590 pre_fichier("cordist.sor","cadrejaune") ;
00591
00592 finblockquote() ;
00593
00594 solution($numExo,$numSerie) ;
00595
00596 p("texte") ;
00597 echo " Cet exercice semble être volontairement non corrigé sur cette page. " ;
00598 span("nou","","onclick = \"window.document.getElementById('lasol').setAttribute('class','visible') \"") ;
00599 echo ghBleu(" Quoique...") ;
00600 finp() ;
00601
00602 p("texte") ;
00603 #echo " En fait, la solution se fait en cliquant sur l'un des mots du paragraphe précédent. Sauriez-vous " ;
00604 #echo " deviner lequel ?" ;
00605 echo em(" Actually, the solution is available if you click on one the word of the preceding paragraph. ") ;
00606 echo em(" Can you guess which one it is?") ;
00607 finp() ;
00608
00609 div("invisible","lasol") ;
00610
00611 h3("7.1 Passage en revue des colonnes") ;
00612
00613 blockquote() ;
00614
00615 p("texte") ;
00616 echo " Avant de passer de cette boucle POUR à un APPLY, essayons d'analyser ce qui pourrait déjà être amélioré " ;
00617 echo" dans le code afin qu'on puisse s'en resservir." ;
00618 finp() ;
00619
00620 p("texte") ;
00621 echo " Pour gagner en généralité, le mieux est d'essayer de définir une fonction et de passer les données en paramètre. " ;
00622 echo " L'intérêt est qu'on pourra tester et réutiliser cette fonction en-dehors de la boucle." ;
00623 echo " Voici donc une première tentative, toujours avec la boucle POUR. " ;
00624 finp() ;
00625
00626 pre_fichier("revueColonnes2.r","cadre") ;
00627 pre_fichier("revueColonnes2.sor","cadrejaune") ;
00628
00629 p("texte") ;
00630 echo " Enfin, une \"vraie\" solution $R consiste à renvoyer un ".em("data.frame") ;
00631 echo " car cette structure de données est adaptée à l'utilisation de " ;
00632 echo hrrr("apply")." et ".hrrr("lapply","","sapply")." comme on peut le voir ci-dessous " ;
00633 finp() ;
00634
00635 pre_fichier("revueColonnes3.r","cadrebleu") ;
00636 pre_fichier("revueColonnes3.sor","cadrejaune") ;
00637
00638 finblockquote() ;
00639
00640 h3("7.2 Matrice triangulaire inférieure") ;
00641
00642 blockquote() ;
00643
00644 p("texte") ;
00645 echo " Pour la matrice triangulaire inférieure, une(e) habitué(e) des matrices carrées de taille ".em("n") ;
00646 echo " viendra utiliser une boucle POUR de 1 à ".em("n")." avec un indice ".em("i")." sur les lignes et " ;
00647 echo " une boucle POUR de 1 à ".em("i")." sur les colonnes, soit le code :" ;
00648 finp() ;
00649
00650 pre_fichier("triang1.r","cadrebleu") ;
00651 pre_fichier("triang1.sor","cadrejaune") ;
00652
00653 p("texte") ;
00654 echo " Commençons par remplacer la boucle la plus interne par une fonction ".b("printLig") ;
00655 echo " afin de pouvoir utiliser ".b("sapply")." sur les indices de lignes :" ;
00656 finp() ;
00657
00658 pre_fichier("triang2.r","cadrebleu") ;
00659 pre_fichier("triang2.sor","cadrejaune") ;
00660
00661 p("texte") ;
00662 echo " Il n'est pas difficile d'arranger un peu les sorties de cette fonction :" ;
00663 finp() ;
00664
00665 pre_fichier("triang3.r","cadrebleu") ;
00666 pre_fichier("triang3.sor","cadrejaune") ;
00667
00668 p("texte") ;
00669 echo " Il suffit maintenant d'utiliser la notation ".b("deux points")." de $R pour éliminer " ;
00670 echo " la deuxième boucle POUR " ;
00671 echo " car la fonction ".b("printLig") ;
00672 echo " ne fait qu'appeler la fonction ".hrrr("sprintf")." qui est une fonction ".b("vectorielle") ;
00673 echo " donc éliminer cette boucle est facile. " ;
00674 echo " Du coup, la fonction ".b("printLig")." peut être remplacée " ;
00675 echo " par une fonction anonyme :" ;
00676 finp() ;
00677
00678 pre_fichier("triang4.r","cadrebleu") ;
00679 pre_fichier("triang4.sor","cadrejaune") ;
00680
00681 p("texte") ;
00682 echo " On peut bien sûr faire mieux et plus court, parce que $R " ;
00683 echo " dispose de la fonction ".hrrr("lower.tri")." dans le package ".hrrp("base") ;
00684 echo " :" ;
00685 finp() ;
00686
00687 pre_fichier("triang5.r","cadrebleu") ;
00688 pre_fichier("triang5.sor","cadrejaune") ;
00689
00690 p("texte") ;
00691 echo " Voici enfin la \"vraie\" solution $R qui ".b("produit")." une matrice triangulaire inférieure, " ;
00692 echo " avec des noms de lignes et de colonnes, au lieu d'un simple affichage :" ;
00693 finp() ;
00694
00695 pre_fichier("triang6.r","cadrebleu") ;
00696 pre_fichier("triang6.sor","cadrejaune") ;
00697
00698 finblockquote() ;
00699
00700 findiv() ;
00701
00702 finsolution() ;
00703
00704 finblockquote() ;
00705
00706 ## -------------------------------------------------------------------------------------------
00707
00708 finPageExercices($numSerie) ; # contient finSection() et finPage() ; la fonction est dans progi.php
00709
00710 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)