Valid XHTML     Valid CSS2    

Listing du fichier progie6.php

 

00001     <?php
00002     #   # (gH)   -_-  progie6.php  ;  TimeStamp (unix) : 16 F&eacute;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 
;
00012     debutPageExercices
($numSerie) ;
00013     
00014     ## -------------------------------------------------------------------------------------------
00015     
00016     p
("texte") ;
00017     echo "" 
;
00018     finp
() ;
00019     debutSection
() ;
00020     
00021     $tableauDesRubriques 
= array() ;
00022     $idr 
;
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&eacute;sultats pour publication ou d&eacute;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 
;
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&eacute;cuter une m&ecirc;me action sur une s&eacute;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&eacute;menter cela en $R&nbsp;?" ;
00058     echo " Et avec un affichage comme&nbsp;:" 
;
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&eacute;duire l'action &agrave; ex&eacute;cuter sur le fichier au simple affichage de son nom." 
;
00069     echo " On admettra donc que le traitement d'un fichier est r&eacute;alis&eacute; par la fonction suivante&nbsp;:" 
;
00070     finp
() ;
00071     
00072     pre_fichier
("action1.r","cadrebleu") ;
00073     
00074     p
("texte") ;
00075     echo "Pour traiter une liste de fichiers comme celle indiqu&eacute;e, il pourrait &ecirc;tre tentant d'&eacute;crire une " 
;
00076     echo " boucle POUR &agrave; partir de la liste des fichiers, soit le code &nbsp;:" 
;
00077     finp
() ;
00078     
00079     pre_fichier
("action2.r","cadrebleu") ;
00080     
00081     p
("texte") ;
00082     echo "D'o&ugrave; l'affichage&nbsp;:" 
;
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 &agrave; programmer une boucle, alors " 
;
00089     echo " qu'on peut se contenter d'&eacute;crire le code &nbsp;:" 
;
00090     finp
() ;
00091     
00092     pre_fichier
("action3.r","cadrebleu") ;
00093     
00094     p
("texte") ;
00095     echo "dont l'affichage est&nbsp;:" 
;
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&nbsp;xx/yy")." il est " ;
00102     echo " possible d'&eacute;crire, toujours sans boucle&nbsp;:" 
;
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&eacute;es dans un data frame&nbsp;?" ;
00123     echo " Par exemple,  comment convertir les unit&eacute;s am&eacute;ricaines dans le syst&egrave;me m&eacute;trique pour les " 
;
00124     echo " donn&eacute;es "
.b("height").", ".b("weight")." et ".b("waist")." des donn&eacute;es " ;
00125     echo href
("diabetes.dar","DIABETES")."&nbsp;?" ;  ;
00126     finp
() ;
00127     
00128     finblockquote
() ;
00129     
00130     solution
($numExo,$numSerie) ;
00131     
00132     p
("texte") ;
00133     echo "La r&eacute;ponse tient en un seul mot&nbsp;: il s'agit de " 
;
00134     echo lafonction
("transform").". Voici ce qu'on pourrait naivement &eacute;crire, si on ne connaissait pas cette fonction&nbsp;:" ;
00135     finp
() ;
00136     
00137     pre_fichier
("transform1.r","cadrebleu") ;
00138     
00139     p
("texte") ;
00140     echo "Et bien s&ucirc;r la \"bonne\" solution, plus concise avec " 
;
00141     echo lafonction
("transform")."&nbsp;:" ;
00142     finp
() ;
00143     
00144     pre_fichier
("transform2.r","cadrebleu") ;
00145     
00146     
00147     p
("texte") ;
00148     echo "Pour des transformations plus sophistiqu&eacute;es, par exemple si on veut utiliser dans la foul&eacute;e des colonnes tout juste cr&eacute;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&ccedil;on la plus efficace en 
$R pour trouver les positions d'&eacute;l&eacute;ments remarquables&nbsp;?" ;
00168     echo " Par exemple pour trouver les positions du minimum, ou les valeurs plus grandes que la moyenne plus deux &eacute;cart-types&nbsp;?" 
;
00169     finp
() ;
00170     
00171     finblockquote
() ;
00172     
00173     solution
($numExo,$numSerie) ;
00174     
00175     p
("texte") ;
00176     echo "Nous avons d&eacute;j&agrave; vu et expliqu&eacute; ce genre de probl&egrave;me et la r&eacute;ponse est le "
.rouge("filtrage vectoriel").". " ;
00177     echo " Voici par exemple comment compter combien de valeurs sont sup&eacute;rieures &agrave; la moyenne&nbsp;:" 
;
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&eacute;menter une barre de progression en 
$R&nbsp;?" ;
00198     finp
() ;
00199     
00200     finblockquote
() ;
00201     
00202     solution
($numExo,$numSerie) ;
00203     
00204     p
("texte") ;
00205     echo "Ceci est un probl&egrave;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 &agrave; essayer de programmer cela. " 
;
00207     echo " On pourra s'en " 
;
00208     echo " convaincre &agrave; l'aide de la commande " 
;
00209     echo b
('RSiteSearch("progress bar")').". La page Web associ&eacute;e est " ;
00210     echo href
("http://search.r-project.org/cgi-bin/namazu.cgi?query=progress+bar&amp;max=20&amp;result=normal&amp;sort=score&amp;idxname=functions&amp;idxname=vignettes&amp;idxname=views","ici").". " ;
00211     finp
() ;
00212     
00213     p
("texte") ;
00214     echo "Parmi les dizaines de r&eacute;ponses, nous en retiendrons deux, \n" 
;
00215     echo "celle du package "
.hrrp("utils")." nomm&eacute;e ".hrrr("txtProgressBar","utils")." et \n" ;
00216     echo "celle du package "
.hrrp("tcltk")." nomm&eacute;e ".hrrr("tkProgressBar","tcltk").". \n" ;
00217     finp
() ;
00218     
00219     p
("texte") ;
00220     echo "Prenons tout d'abord quelque chose d'un peu long &agrave; calculer&nbsp;: \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&egrave;res \"&eacute;gal\". Nous commen&ccedil;ons par afficher une ligne d'&eacute;toiles de la \n" 
;
00228     echo "m&ecirc;me longueur que la barre de progression&nbsp;: \n" 
;
00229     finp
() ;
00230     
00231     pre_fichier
("progressb02.r","cadre") ;
00232     
00233     p
("texte") ;
00234     echo "Voici ce qui est affich&eacute; au bout de 10 secondes si on ex&eacute;cute \n" 
;
00235     finp
() ;
00236     
00237     pre_fichier
("progressb02.txt","cadre") ;
00238     
00239     p
("texte") ;
00240     echo "Les barres de progression affich&eacute;es par "
.hrrr("tkProgressBar","tcltk")." sont des fen&ecirc;tres &agrave; part et qui n'apparaissent pas \n" ;
00241     echo "dans la sortie console. En voici un exemple, inspir&eacute;, "
.em("bien s&ucirc;r")." de ".b("example(tkProgressBar)")." \n" ;
00242     echo "sachant que la syntaxe de la fonction  "
.hrrr("tkProgressBar","tcltk")." \n" ;
00243     echo "est tr&egrave;s similaire &agrave; celle de la fonction "
.hrrr("txtProgressBar","utils")."&nbsp;: \n" ;
00244     finp
() ;
00245     
00246     pre_fichier
("progress03.r","cadre") ;
00247     
00248     p
("texte") ;
00249     echo "Voici ce qui est affich&eacute; au bout de 10 secondes&nbsp;:" 
;
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&nbsp;:")." il y a tr&egrave;s souvent dans les packages $R tout ce qu'on veut comme solution technique \n" ;
00262     echo "&agrave; un probl&egrave;me classique ou fr&eacute;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&eacute;j&agrave; vu dans nos codes-source les fins de fonctions \n" 
;
00281     echo "document&eacute;es comme ceci&nbsp;: \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'&eacute;crire une fonction qui utilise un param&egrave;tre qui correspond \n" 
;
00292     echo "&agrave; un nom de fichier script au sens de 
$R et en affiche la liste des fonctions \n" ;
00293     echo "avec le num&eacute;ro de ligne du d&eacute;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&nbsp;?" 
;
00301     finp
() ;
00302     
00303     finblockquote
() ;
00304     
00305     solution
($numExo,$numSerie) ;
00306     
00307     p
("texte") ;
00308     echo "Ecrire explicitement "
.noir("# fin de fonction").", comme &eacute;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 &ecirc;tre humain (l'interpr&eacute;teur \n" 
;
00312     echo 
$R, lui, utilise d'autres r&egrave;gles pour \"lire\" et \"comprendre\" le code). \n" ;
00313     finp
() ;
00314     
00315     p
("texte") ;
00316     echo "Il est s&ucirc;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'&eacute;crire \n" 
;
00330     finp
() ;
00331     
00332     pre_fichier
("cmt03.txt","cadre") ;
00333     
00334     p
("texte") ;
00335     echo "m&ecirc;me si certains &eacute;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 &eacute;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")."&nbsp;: \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'&eacute;criture comme par exemple \n" 
;
00353     echo "mettre le d&eacute;but et la fin de fonction sur une seule ligne, produire une liste des fonctions \n" 
;
00354     echo "comme celle demand&eacute;e consiste juste &agrave; savoir d&eacute;tecter les expressions "
.noir("&lt;-&nbsp;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&eacute;ros de lignes. \n" ;
00361     finp
() ;
00362     
00363     p
("texte") ;
00364     echo "Il suffit d'&eacute;crire, apr&egrave;s la lecture du fichier par "
.noir("lignes &lt;- 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&eacute;guli&egrave;re utilis&eacute;e ici "
.noir("\"&lt;-".$bs.$bs."s+function".$bs.$bs."$pg\"")." est un tout petit peu plus compliqu&eacute;e \n" ;
00373     echo "que la simple chaine "
.noir("\"&lt;- 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("&lt;-")."  et ".noir("function")." \n" ;
00381     echo "d'o&ugrave; la partie "
.noir("\\s+")."&nbsp;; \n" ;
00382     finp
() ; finli() ;
00383     
00384     debutli
() ; p() ;
00385     echo "pour saisir un \"slash\" dans une expression r&eacute;guli&egrave;re, il faut doubler ce symbole, d'o&ugrave;  "
.noir("\\\\s+")."&nbsp;; \n" ;
00386     finp
() ; finli() ;
00387     
00388     debutli
() ; p() ;
00389     echo "pour saisir une parenth&egrave;se dans une expression r&eacute;guli&egrave;re, il faut la faire pr&eacute;c&eacute;der d'un \"slash\" qui doit lui-m&ecirc;me \n" 
;
00390     echo "&ecirc;tre doubl&eacute; d'o&ugrave; "
.noir("\\\\(").". \n" ;
00391     finp
() ; finli() ;
00392     
00393     finul
() ;
00394     
00395     p
("texte") ;
00396     echo "Si de plus on utilise le param&egrave;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&eacute;tect&eacute;e. Voici ce qu'on \n" ;
00399     echo "peut donc facilement obtenir avec 
$R juste avec ".noir("grep()")."et l'expression r&eacute;guli&egrave;re&nbsp;: \n" ;
00400     finp
() ;
00401     
00402     pre_fichier
("grep02.txt","cadre") ;
00403     
00404     p
("texte") ;
00405     echo "Au niveau de la deuxi&egrave;me expression r&eacute;guli&egrave;re, nous avons ajout&eacute; "
.noir(".*")." devant ".noir("&lt;-")." afin de r&eacute;cup&eacute;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&eacute;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&nbsp;: \n" 
;
00411     finp
() ;
00412     
00413     pre_fichier
("listefonc.r","cadre") ;
00414     
00415     p
("texte") ;
00416     echo "Le rendu est presque conforme &agrave; ce qu'on voulait \n" 
;
00417     finp
() ;
00418     
00419     pre_fichier
("listefonc2.txt","cadre") ;
00420     
00421     p
("texte") ;
00422     echo "au cadrage pr&egrave;s des num&eacute;ros de ligne &agrave; droite, ce qu'on peut obtenir \n" 
;
00423     echo "facilement avec la fonction "
.hrrr("sprintf").". Il manque aussi les parenth&egrave;ses apr&egrave;s le nom des fonctions, ce qu'on r&eacute;alise tr&egrave;s \n" ;
00424     echo "simplement la fonction "
.hrrr("paste").". Donc au lieu du ".noir("print()")." en fin de fonction, si on &eacute;crit \n" ;
00425     finp
() ;
00426     
00427     pre_fichier
("listefonc2.r","cadre") ;
00428     
00429     p
("texte") ;
00430     echo "alors le r&eacute;sultat est exactement ce qu'on voulait&nbsp;: \n" 
;
00431     finp
() ;
00432     
00433     pre_fichier
("listefonc3.txt","cadre") ;
00434     
00435     p
("texte") ;
00436     echo "Vous aurez remarqu&eacute;, bien s&ucirc;r, qu'il n'y a pas de boucle, car nous n'avons utilis&eacute; 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&eacute;cup&eacute;rer le param&egrave;tre qui correspond au nom du fichier&nbsp;:" 
;
00442     finp
() ;
00443     
00444     pre_fichier
("listefonc4.txt","cadrejaune") ;
00445     
00446     p
() ;
00447     echo "Fichiers associ&eacute;s&nbsp;: " 
;
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&eacute;sultats pour publication ou d&eacute;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&ccedil;on reproductible des " ;
00469     echo " r&eacute;sultats num&eacute;riques et graphiques sans avoir &agrave; passer par du copier/coller pour produire les " 
;
00470     echo " documents associ&eacute;s. Comment faut-il s'y prendre&nbsp;?" 
;
00471     echo " Et si on a besoin de tirages al&eacute;atoires dans les calculs&nbsp;?" 
;
00472     finp
() ;
00473     
00474     finblockquote
() ;
00475     
00476     solution
($numExo,$numSerie) ;
00477     
00478     p
("texte") ;
00479     echo "Pour produire des r&eacute;sultats reproductibles, il vaut mieux &eacute;viter d'utiliser 
$R via $rstudio &agrave; cause des " ;
00480     echo " variables qui pourraient &ecirc;tre dans l'environnement. Il est donc conseill&eacute; d'ex&eacute;cuter 
$R directement. " ;
00481     echo " Si on utilise des valeurs al&eacute;atoires, il faut utiliser toujours la m&ecirc;me " 
;
00482     echo hrrr
("Random","","graine").". Voici un exemple d'utilisation&nbsp;:" ;
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&eacute;sultats, il est clair que la technique du " 
;
00490     echo b
("copier/coller")." n'est pas envisageable, de par le nombre et la r&eacute;p&eacute;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&ocirc;t que " ;
00494     echo href
("https://www.statistik.lmu.de/~leisch/Sweave/","Sweave")."). " ;
00495     echo " Elle s'int&egrave;gre &agrave; du code LaTeX, HTML ou Markdown." 
;
00496     finp
() ;
00497     
00498     p
("texte") ;
00499     echo "Imaginons par exemple qu'on veuille r&eacute;diger un document qui montre comment tracer la densit&eacute; d'un m&eacute;lange de deux lois normales. " 
;
00500     echo " Voici la fonction "
.b("traceNorms()")." du fichier ".href("alea2.r")." qui r&eacute;alise ce trac&eacute;&nbsp;:";
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&eacute; "
.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&nbsp;:" ;
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&eacute;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&nbsp;alea.tex")." on obtient alors le fichier ".href("alea.pdf")."." ;
00520     echo " Facile, non &nbsp;? " 
;
00521     echo " Oui, si on connait d&eacute;j&agrave; "
.href("http://fr.wikibooks.org/wiki/LaTeX","LaTeX")."." ;
00522     finp
() ;
00523     
00524     p
("texte") ;
00525     echo "Il serait m&ecirc;me possible de cr&eacute;er une page Web pour faire saisir &agrave; l'utilisateur les 5  "
;
00526     echo " param&egrave;tres de la fonction "
.b("traceNorms()")." et produire le PDF &agrave; la vol&eacute;e, mais c'est une autre histoire, " ;
00527     echo " qui met en jeu trois autres langages, &agrave; savoir PHP, HTML et CSS..." 
;
00528     finp
() ;
00529     
00530     p
("texte") ;
00531     echo " Pour avoir rapidement une id&eacute;e des possibilit&eacute;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&eacute;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&eacute;r&ecirc;t de passer par des fonctions *APPLY&nbsp;?" 
;
00578     finp
() ;
00579     
00580     p
("texte") ;
00581     echo " Comment produire la matrice triangulaire inf&eacute;rieure d'une matrice sym&eacute;trique&nbsp? " 
;
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&eacute;n&eacute;rer une telle matrice, comme par exemple&nbsp;:" 
;
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 &ecirc;tre volontairement non corrig&eacute; 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&eacute;c&eacute;dent. Sauriez-vous " ;
00604     #echo " deviner lequel&nbsp;?" ;
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 &agrave; un APPLY, essayons d'analyser ce qui pourrait d&eacute;j&agrave; &ecirc;tre am&eacute;lior&eacute; " 
;
00617      echo" dans le code afin qu'on puisse s'en resservir." 
;
00618     finp
() ;
00619     
00620     p
("texte") ;
00621     echo " Pour gagner en g&eacute;n&eacute;ralit&eacute;, le mieux est d'essayer de d&eacute;finir une fonction et de passer les donn&eacute;es en param&egrave;tre. " 
;
00622     echo " L'int&eacute;r&ecirc;t est qu'on pourra tester et r&eacute;utiliser cette fonction en-dehors de la boucle." 
;
00623     echo " Voici donc une premi&egrave;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 &agrave; renvoyer un ".em("data.frame") ;
00631     echo " car cette structure de donn&eacute;es est adapt&eacute;e &agrave; l'utilisation de " 
;
00632     echo hrrr
("apply")." et ".hrrr("lapply","","sapply")." comme on peut le voir ci-dessous&nbsp;" ;
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&eacute;rieure") ;
00641     
00642     blockquote
() ;
00643     
00644     p
("texte") ;
00645     echo " Pour la matrice triangulaire inf&eacute;rieure, une(e) habitu&eacute;(e) des matrices carr&eacute;es de taille "
.em("n") ;
00646     echo " viendra utiliser une boucle POUR de 1 &agrave; "
.em("n")." avec un indice ".em("i")." sur les lignes et " ;
00647     echo " une boucle POUR de 1 &agrave; "
.em("i")." sur les colonnes, soit le code&nbsp;:" ;
00648     finp
() ;
00649     
00650     pre_fichier
("triang1.r","cadrebleu") ;
00651     pre_fichier
("triang1.sor","cadrejaune") ;
00652     
00653     p
("texte") ;
00654     echo " Commen&ccedil;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&nbsp;:" ;
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 &nbsp;:" 
;
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 &eacute;liminer " ;
00670     echo " la deuxi&egrave;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 &eacute;liminer cette boucle est facile. " 
;
00674     echo " Du coup, la fonction "
.b("printLig")." peut &ecirc;tre remplac&eacute;e " ;
00675     echo " par une fonction anonyme&nbsp;:" 
;
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&ucirc;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 "&nbsp;:" 
;
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&eacute;rieure, " ;
00692     echo " avec des noms de lignes et de colonnes, au lieu d'un simple affichage&nbsp;:" 
;
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 gH    Retour à la page principale de   (gH)