Valid XHTML     Valid CSS2    

Listing du fichier progie5.php

 

00001     <?php
00002     
# # (gH) -_- progie5.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
= 5 ;
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] = "Soulign&eacute;s et encadr&eacute;s" ;
00025     
$idr
++; $tableauDesRubriques[$idr] = "Utilisation de ".rouge("sink()")." et ".rouge("source()") ;
00026     
$idr
++; $tableauDesRubriques[$idr] = "Une fonction pour attendre" ;
00027     
$idr
++; $tableauDesRubriques[$idr] = "Reproduire la fonction ".noir("ifelse") ;
00028     
$idr
++; $tableauDesRubriques[$idr] = "Une fonction anonyme pour g&eacute;rer les NA&nbsp;?" ;
00029     
$idr
++; $tableauDesRubriques[$idr] = "Formater l'affichage d'un data frame" ;
00030     
$idr
++; $tableauDesRubriques[$idr] = "Bien afficher ".noir("par()")." et ".noir("options()") ;
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++ ; # Soulign&eacute;s et encadr&eacute;s
00046     
00047     ## -------------------------------------------------------------------------------------------
00048     
00049     
blockquote() ;
00050     
00051     
blockquote() ;
00052     
00053     
p
("texte") ;
00054     echo
"
$R affiche les informations en mode texte et ce n'est pas toujours facile de trouver \n" ;
00055     echo
"rapidement ce que l'on cherche dans les r&eacute;sultats d'ex&eacute;cution. Ecrire une fonction \n" ;
00056     echo
"nomm&eacute;e "
.b("souligne()")." qui souligne un texte pass&eacute; en param&egrave;tre avec le symbole &eacute;gal par d&eacute;faut \n" ;
00057     echo
"comme caract&egrave;re de soulignement, ou avec un autre caract&egrave;re pass&eacute; en deuxi&egrave;me param&egrave;tre. \n" ;
00058     
finp() ;
00059     
00060     
p
("texte") ;
00061     echo
"Serait-ce beaucoup plus difficile de r&eacute;aliser un encadrement ? \n" ;
00062     
finp() ;
00063     
00064     
p
("texte") ;
00065     echo
"Voici des exemples d'ex&eacute;cution pour illustrer ce qu'on voudrait r&eacute;aliser. \n" ;
00066     
finp() ;
00067     
00068     
pre_fichier
("souligne01.txt","cadre") ;
00069     
00070     
finblockquote() ;
00071     
00072     
solution
($numExo,$numSerie) ;
00073     
00074     
p
("texte") ;
00075     echo
"Pour souligner, on peut se contenter d'afficher autant de caract&egrave;res \"&eacute;gal\" que le texte a \n" ;
00076     echo
"de caract&egrave;res. Comme "
.b("nchar(chaine)")." donne la longueur de la chaine, on doit donc \n" ;
00077     echo
"g&eacute;n&eacute;rer tous ces caract&egrave;res avec \n" ;
00078     echo
"la fonction "
.hrrr("rep")." \n" ;
00079     echo
"puis les mettre bout &agrave; bout \n" ;
00080     echo
"avec la fonction "
.hrrr("paste").", soit le code suivant o&ugrave; le param&egrave;tre ".b("avec")." d&eacute;signe le \n" ;
00081     echo
"caract&egrave;re de soulignement, dont "
.b("=")." est la valeur par d&eacute;faut&nbsp;: \n" ;
00082     
finp() ;
00083     
00084     
pre_fichier
("souligne01.r","cadre") ;
00085     
00086     
p
("texte") ;
00087     echo
"Pour encadrer, c'est &agrave; peine plus compliqu&eacute;, puisqu'il suffit de produire le soulignement avant et apr&egrave;s le texte \n" ;
00088     echo
"et de rajouter un symbole en d&eacute;but et en fin de ligne. Comme nous utilisons deux fois les m&ecirc;mes informations, \n" ;
00089     echo
"nous avons cr&eacute;&eacute; deux variables, "
.b("ligneVide")." et ".b("lignePleine")." pour que ce soit plus facile &agrave; maintenir&nbsp;: \n" ;
00090     echo
" \n" ;
00091     
finp() ;
00092     
00093     
pre_fichier
("souligne02.r","cadre") ;
00094     
00095     
finsolution() ;
00096     
00097     
finblockquote() ;
00098     
00099     
## -------------------------------------------------------------------------------------------
00100     
00101     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Utilisation de sink() et source()
00102     
00103     ## -------------------------------------------------------------------------------------------
00104     
00105     
blockquote() ;
00106     
00107     
blockquote() ;
00108     
00109     
p
("texte") ;
00110     echo
"Comment fait-on pour ex&eacute;cuter du code
$R en mode session, avec $rstudio ou en ligne de commandes ".em("shell")."&nbsp;?" ;
00111     echo
" Quelles sont les options d'ex&eacute;cution&nbsp;?" ;
00112     echo
" Comment obtenir un fichier "
.em('"log"')." qui contient une copie dans un fichier texte de tout ce qui " ;
00113     echo
" a &eacute;t&eacute; affich&eacute;&nbsp;?" ;
00114     
finp() ;
00115     
00116     
p
("texte") ;
00117     echo
"Apr&egrave;s avoir lu l'aide sur les fonctions " ;
00118     echo
hrrr
("sink") ;
00119     echo
" et " ;
00120     echo
hrrr
("source").", expliquer ce que r&eacute;alise la fonction ".b("sinksource()")." suivante et " ;
00121     echo
" comment on s'en sert&nbsp;:" ;
00122     
finp() ;
00123     
00124     
pre_fichier
("sinksource01.r","cadre") ;
00125     
00126     
finblockquote() ;
00127     
00128     
solution
($numExo,$numSerie) ;
00129     
00130     
p
("texte") ;
00131     echo
"En mode session, on peut " ;
00132     
finp() ;
00133     
00134     
ul() ;
00135     
00136     
debutli
() ; p() ;
00137      echo
"saisir au clavier les instructions, " ;
00138     
finp
() ; finli() ;
00139     
00140     
debutli
() ; p() ;
00141      echo
"copier/coller des instructions venus d'un &eacute;diteur ou d'une page web," ;
00142     
finp
() ; finli() ;
00143     
00144     
debutli
() ; p() ;
00145      echo
"ex&eacute;cuter les instructions d'un fichier avec "
.hrrr("source").". " ;
00146     
finp
() ; finli() ;
00147     
00148     
finul() ;
00149     
00150     
p
("texte") ;
00151     echo
"Avec
$rstudio, on peut de plus ex&eacute;cuter le code du panneau ".b("Source")."." ;
00152     
finp() ;
00153     
00154     
p
("texte") ;
00155     echo
"En ligne de commandes "
.em("shell")." on peut soit ex&eacute;cuter une expression avec l'option ".bleu("-e") ;
00156     echo
" soit ex&eacute;cuter les instructions d'un fichier avec l'option "
.bleu("-f")."." ;
00157     
finp() ;
00158     
00159     
p
("texte") ;
00160     echo
" Parmi les nombreux param&egrave;tres de "
.hrrr("source").", les param&egrave;tres " ;
00161     echo
b
("echo").", " ;
00162     echo
b
("print.eval")." et " ;
00163     echo
b
("verbose")." permettent de g&eacute;rer l'affichage. Ainsi, avec ".b("echo=TRUE").", $R affiche chaque instruction avant de l'ex&eacute;cuter. " ;
00164     echo
"Avec "
.b("print.eval=TRUE")." $R affiche chaque valeur calcul&eacute;e par affectation. " ;
00165     echo
" Voir cela en action dans notre "
.href("../../Introduction_R/intror2.php?solutions=1#tdm1","s&eacute;ance 2") ;
00166     echo
" d'"
.href("../../Introduction_R/","introduction &agrave; $R","grouge nou").". " ;
00167     
finp() ;
00168     
00169     
p
("texte") ;
00170     echo
"La lecture du texte d'aide de la fonction "
.hrrr("sink")." explique que cette fonction permet de rediriger l'affichage vers un fichier. " ;
00171     echo
" Avec le param&egrave;tre "
.b("split=TRUE")." l'affichage est &agrave; la fois redirig&eacute; vers l'&eacute;cran et le fichier." ;
00172     
finp() ;
00173     
00174     
p
("texte") ;
00175     echo
" Comme son nom l'indique, la fonction "
.b("sinksource()")." r&eacute;alise " ;
00176     echo
" un "
.hrrr("sink")." puis un ".hrrr("source").". Elle vient ensuite fermer le fichier-sink. " ;
00177     echo
" Dans la mesure o&ugrave; le nom du fichier r&eacute;sultat est construit &agrave; partir du nom du fichier programme, chaque programme source " ;
00178     echo
" dispose de son fichier "
.em('"log"').". " ;
00179     echo
" Par exemple, si on ex&eacute;cute "
.b('sinksource("test28")')." alors $R ex&eacute;cute le fichier ".b("test28.r")." et " ;
00180     echo
" tout ce qui est affich&eacute; &agrave; l'&eacute;cran est automatiquement recopi&eacute; dans le fichier "
.b("test28_log.txt").". " ;
00181     echo
" L'ellipse est mise dans l'ent&ecirc;te de la fonction pour qu'on puisse passer &eacute;ventuellement des options " ;
00182     echo
" comme "
.b("echo=TRUE").". On n'est pas oblig&eacute; d'&eacute;crire ".b(".r")." &agrave; la fin du nom du fichier parce que la fonction " ;
00183     echo
" d&eacute;tecte la pr&eacute;sence ou l'absence de "
.b(".r")." en fin de nom de fichier fourni et rajoute ".b(".r")." s'il le faut." ;
00184     
00185     
finp() ;
00186     
00187     
finsolution() ;
00188     
00189     
finblockquote() ;
00190     
00191     
## -------------------------------------------------------------------------------------------
00192     
00193     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une fonction pour attendre
00194     
00195     ## -------------------------------------------------------------------------------------------
00196     
00197     
blockquote() ;
00198     
00199     
blockquote() ;
00200     
00201     
p
("texte") ;
00202     echo
"On a de temps en temps besoin non pas d'interrompre mais de suspendre l'ex&eacute;cution et surtout l'affichage d'un " ;
00203     echo
" programme, par exemple pour v&eacute;rifier que les sorties correspondent &agrave; ce qu'on attendait. Ecrire une fonction " ;
00204     echo
b
("attendre")." qui suspend le script, pose une question et continue le script si on appuie juste sur \"Entr&eacute;e\"" ;
00205     echo
" ou qui quitte le programme si on &eacute;crit quelque chose." ;
00206     
finp() ;
00207     
00208     
finblockquote() ;
00209     
00210     
solution
($numExo,$numSerie) ;
00211     
00212     
p
("texte") ;
00213     echo
"Voici une solution possible. On lit au clavier avec " ;
00214     echo
lafonction
("readline")." et on arr&ecirc;te le script avec ".hrrr("stop")."&nbsp;:" ;
00215     
finp() ;
00216     
00217     
pre_fichier
("attendre.txt","cadre") ;
00218     
00219     
finsolution() ;
00220     
00221     
finblockquote() ;
00222     
00223     
## -------------------------------------------------------------------------------------------
00224     
00225     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Reproduire lafonction("ifelse")
00226     
00227     ## -------------------------------------------------------------------------------------------
00228     
00229     
blockquote() ;
00230     
00231     
blockquote() ;
00232     
00233     
p
("texte") ;
00234     echo
"Afin de comprendre ce que fait la fonction
$R " ;
00235     echo
" nomm&eacute;e "
.hrrr("ifelse").", &eacute;crire une fonction ".b("sialors")." qui utilise trois param&egrave;tres, " ;
00236     echo
b
("condition").", ".b("sioui").", ".b("sinon")." et dont le comportement est le suivant&nbsp;:" ;
00237     
finp() ;
00238     
00239     
pre_fichier
("s5e1.txt","cadre") ;
00240     
00241     
p
("texte") ;
00242     echo
"On rajoutera un test sur les param&egrave;tres&nbsp;: ainsi "
.b("sialors()")." sans param&egrave;tre devra " ;
00243     echo
" afficher une aide avec le rappel de la syntaxe et des exemples, comme par exemple&nbsp;:" ;
00244     
finp() ;
00245     
00246     
pre_fichier
("s5e2.txt","cadre") ;
00247     
00248     
p
("texte") ;
00249     echo
"Peut-on consulter le code de la fonction "
.hrrr("ifelse")."&nbsp;?" ;
00250     
finp() ;
00251     
00252     
finblockquote() ;
00253     
00254     
solution
($numExo,$numSerie) ;
00255     
00256     
p
("texte") ;
00257     echo
"Comme dit pr&eacute;c&eacute;demment, il vaut mieux &eacute;viter les boucles, d'o&ugrave; une solution par filtrage vectoriel&nbsp;:" ;
00258     
finp() ;
00259     
00260     
pre_fichier
("sialors.r","cadre") ;
00261     
00262     
p
("texte") ;
00263     echo
"Pour consulter le code source de "
.lafonction("ifelse")."il suffit de taper son nom, sans les parenth&egrave;ses&nbsp;:" ;
00264     
finp() ;
00265     
00266     
pre_fichier
("ifelse.sor","cadre") ;
00267     
00268     
finsolution() ;
00269     
00270     
finblockquote() ;
00271     
00272     
## -------------------------------------------------------------------------------------------
00273     
00274     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une fonction anonyme pour g&eacute;rer les NA ?
00275     
00276     ## -------------------------------------------------------------------------------------------
00277     
00278     
blockquote() ;
00279     
00280     
blockquote() ;
00281     
00282     
p
("texte") ;
00283     echo
"On voudrait calculer les moyennes des colonnes d'un data frame sachant qu'il y a des valeurs NA, comme par " ;
00284     echo
" exemple pour les donn&eacute;es des colonnes 2 &agrave; 4 du fichier "
.bleu(href("diabete.dar")).". Montrer que l'utilisation d'une fonction anonyme suffit. " ;
00285     echo
" Peut-on s'en passer&nbsp;? ";
00286     
finp() ;
00287     
00288     
finblockquote() ;
00289     
00290     
solution
($numExo,$numSerie) ;
00291     
00292     
p
("texte") ;
00293     echo
"Effectivement faire un "
.hrrr("lapply","","apply()")." de ".lafonction("mean")." ne renvoie pas le r&eacute;sultat attendu. " ;
00294     echo
" Du coup, &eacute;crire une fonction anonyme &agrave; la vol&eacute;e est tentant&nbsp;:" ;
00295     
finp() ;
00296     
00297     
entree_R
("diabete1.r") ;
00298     
sortie_R
("diabete1.res") ;
00299     
00300     
00301     
p
("texte") ;
00302     echo
"Mais ce serait m&eacute;connaitre R&nbsp;: sapply est capable de prendre des param&egrave;tres suppl&eacute;mentaires. " ;
00303     echo
" De plus,
$R dispose d&eacute;j&agrave; d'une fonction pour ce calcul tr&egrave;s classique, c'est la fonction " ;
00304     echo
hrrr
("colSums","","colMeans()")."&nbsp;:" ;
00305     
finp() ;
00306     
00307     
entree_R
("diabete2.r") ;
00308     
sortie_R
("diabete2.res") ;
00309     
00310     
finsolution() ;
00311     
00312     
finblockquote() ;
00313     
00314     
## -------------------------------------------------------------------------------------------
00315     
00316     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Formater l'affichage d'un data frame"
00317     
00318     ## -------------------------------------------------------------------------------------------
00319     
00320     
blockquote() ;
00321     
00322     
blockquote() ;
00323     
00324     
p
("texte") ;
00325     echo
"
$R sait assez bien formater une matrice de r&eacute;sultats num&eacute;riques parce que toutes les colonnes sont num&eacute;riques. " ;
00326     echo
" Afficher \"proprement\" (avec un format particulier pour chaque colonne) un data.frame n'est vraiment pr&eacute;vu " ;
00327     echo
" en
$R. Impl&eacute;menter une fonction ".b("printdf")." qui prend en entr&eacute;e deux param&egrave;tres ".b("df")." et ".b("fmt").". " ;
00328     echo
b
("df")." est bien s&ucirc;r un data frame et ".b("fmt")." le format de chaque colonne au sens de ".hrrr("sprintf").". " ;
00329     
finp() ;
00330     
00331     
00332     
p
("texte") ;
00333     echo
"Voici ce qu'on veut obtenir par exemple&nbsp;:" ;
00334     
finp() ;
00335     
00336     
pre_fichier
("printdf_xmp.txt","cadre") ;
00337     
00338     
finblockquote() ;
00339     
00340     
solution
($numExo,$numSerie) ;
00341     
00342     
p
("texte") ;
00343     echo
"Puisque
$R est ".rouge("vectoriel").", la r&eacute;ponse tient en une ligne&nbsp;: il suffit d'utiliser ".hrrr("lapply","","sapply()").". " ;
00344     
finp() ;
00345     
00346     
pre_fichier
("printdf.r","cadrebleu") ;
00347     
00348     
00349     
p
("texte") ;
00350     echo
"Voici des exemples d'utilisation&nbsp;:" ;
00351     
finp() ;
00352     
00353     
pre_fichier
("printdf.lst","cadrejaune") ;
00354     
00355     
00356     
p
("texte") ;
00357     echo
b
("Explications&nbsp;:") ;
00358     
finp() ;
00359     
00360     
p
("texte") ;
00361     echo
"Pour trouver cette solution, on peut commencer par essayer de r&eacute;soudre le probl&egrave;me d'appliquer " ;
00362     echo
" le i-&egrave;me format &agrave; la i-&egrave;me colonne du data frame. C'est tr&egrave;s simple puisque " ;
00363     echo
lafonction
("sprintf")." est ".rouge("vectorielle").". " ;
00364     echo
" On &eacute;crit donc "
.b("sprintf(fmt[i],df[,i])").". " ;
00365     echo
" Ensuite, il faut appliquer cela &agrave; toutes les colonnes. Une solution avec une boucle POUR sur i est " ;
00366     echo
" possible, bien s&ucirc;r mais nous savons qu'il vaut mieux &eacute;viter les boucles POUR. Il reste donc " ;
00367     echo
" la solution avec "
.hrrr("lapply","","sapply()").". " ;
00368     
finp() ;
00369     
00370     
p
("texte") ;
00371     echo
"Comme "
.lafonction("lapply","","sapply()")." applique une fonction, il faut inventer celle qui &agrave; partir de i, fmt et df " ;
00372     echo
" applique sprintf(fmt[i]) &agrave; la colonne i de df. On peut &eacute;crire une fonction nomm&eacute;e, par exemple "
.b("formatCol") ;
00373     echo
" soit localement soit globalement&nbsp;:" ;
00374     
finp() ;
00375     
00376     
pre_fichier
("formatcol.txt","cadre") ;
00377     
00378     
p
("texte") ;
00379     echo
"Une autre solution consiste &agrave; d&eacute;finir une fonction anonyme directement &agrave; la suite de "
.b("FUN=") ;
00380     echo
" dans l'appel de "
.b("sapply").". C'est la solution que nous avons choisie car ".b("formatCol") ;
00381     echo
" pr&eacute;sente peu d'int&eacute;r&ecirc;t en dehors de "
.b("printdf").". " ;
00382     
finp() ;
00383     
00384     
p
("texte") ;
00385     echo
" La notion r&eacute;cente (2016) de "
.em("tibble")." se veut un remplacement \"propre\" (".em("tidy")." en anglais) " ;
00386     echo
" des data.frame, notamment pour ces probl&egrave;mes de format d'affichage. On lira avec int&eacute;r&ecirc;t le document en fran&ccedil;ais " ;
00387     echo
href
("https://juba.github.io/tidyverse/06-tidyverse.html","R et tidyverse")." de J. BARNIER que nous remercions au passage pour ce document." ;
00388     
finp() ;
00389     
00390     
finsolution() ;
00391     
00392     
finblockquote() ;
00393     
00394     
## -------------------------------------------------------------------------------------------
00395     
00396     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Bien afficher par() et options()
00397     
00398     ## -------------------------------------------------------------------------------------------
00399     
00400     
blockquote() ;
00401     
00402     
blockquote() ;
00403     
00404     
p
("texte") ;
00405      echo
" La commande " ;
00406      echo
hrrr
("par","graphics") ;
00407      echo
" donne, avec un affichage peu agr&eacute;able, tous les param&egrave;tres graphiques. Ecrire une fonction " ;
00408      echo
s_span
("parPrint()","grouge")." qui les affiche par ordre alphab&eacute;tique et dont voici un exemple d'affichage (tronqu&eacute;)&nbsp;: " ;
00409     
finp() ;
00410     
00411     
sortie_R
("par1.txt") ;
00412     
00413     
p
("texte") ;
00414      echo
" Utilisez la m&ecirc;me strat&eacute;gie pour la commande " ;
00415      echo
hrrr
("options") ;
00416      echo
" ; on &eacute;crira une fonction " ;
00417      echo
s_span
("optionsPrint()","grouge")." qui pourra trier par type d'information fournie ; " ;
00418      echo
" en voici deux exemples d'affichage (tronqu&eacute;)&nbsp;: " ;
00419     
finp() ;
00420     
00421     
sortie_R
("options1.txt") ;
00422     
00423     
finblockquote() ;
00424     
00425     
solution
($numExo,$numSerie) ;
00426     
00427     
p
("texte") ;
00428      echo
" Voici une impl&eacute;mentation d'une fonction pour visualiser tous les param&egrave;tres graphiques et son affichage complet&nbsp;:" ;
00429     
finp() ;
00430     
00431     
entree_R
("par.r") ;
00432     
00433     
sortie_R
("par2.txt") ;
00434     
00435     
p
("texte") ;
00436      echo
"Comme code d'une fonction qui affiche toutes les options de la configuration de R, nous vous proposons " ;
00437     
finp() ;
00438     
00439     
# ??? expliquer ce qu'on met comme option
00440     
00441     
entree_R
("options.r") ;
00442     
00443     
sortie_R
("options2.txt") ;
00444     
00445     
finsolution() ;
00446     
00447     
finblockquote() ;
00448     
00449     
## -------------------------------------------------------------------------------------------
00450     
00451     
finPageExercices
($numSerie) ; # contient finSection() et finPage() ; la fonction est dans progi.php
00452     
00453     
?>

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)