Programmer en R
Session de formation, décembre 2013
gilles.hunault "at" univ-angers.fr
Enoncés pour la séance numéro 2 (solutions)
Détailler les différents types de boucles en R.
Comment afficher (ou effectuer un calcul sur) les valeurs 1 2 3 4 5 10 100 1000 10000 100000 avec une seule boucle ? et pour les valeurs 12 38 45 70 50 ?
Pourquoi ne faut-il pas écrire sans précaution for (i in 1:n-1) { ... } ? Ni for (i in 1:length(n)) ?
Calculer $\sqrt{X}$ pour X=2 et pour X=3 à l'aide de la récurrence suivante (on pourra prendre $x_0=1$ et inventer un critère d'arrêt basé sur la précision)
$x_n = \frac{a}{x_{n-1}} + \frac{x_{n-1}}{b} $
Implémenter la fonction dichotomise() sans utiliser ifelse(). On utilisera une boucle et un test en si à l'intérieur de la boucle. Ecrire ensuite une version sans boucle, toujours sans utiliser ifelse(). Comment optimiser le calcul ?
On rappelle que dichotomiser un vecteur V à partir d'un seuil S, c'est renvoyer un vecteur de même longueur que V et dont les éléments valent VRAI si la valeur en même position dans V est strictement inférieure au seuil. Par exemple dichotomise(vecteur=c(1,2,8,3),seuil=5)) doit renvoyer (TRUE,TRUE,FALSE,TRUE).
Une fois le vecteur de valeurs logiques obtenues, comment peut-on s'en servir pour avoir les valeurs "jeune" et "vieux" respectivement pour TRUE et FALSE ? et pour avoir des couleurs de tracé "red" et "blue" respectivement pour TRUE et FALSE ? En déduire comment tracer avec différentes tailles les jeunes et vieux ; on ajoutera une légende avec les couleurs.
Implémenter la fonction posMin() qui renvoie toutes les positions du minimum avec une boucle puis sans boucle. Comment optimiser le calcul ?
Comment tester la vitesse d'exécution d'une fonction, par exemple pour comparer les fonctions dichotomiseVersion1(), dichotomiseVersion2() et dichotomiseVersion3() ou les trois versions qui trouvent les positions du minimum ?
Code-source des ces fonctions : dichotomise.r posmin.r
Où mettre la fonction duree() pour qu'on puisse l'utiliser n'importe où dès que R est chargé ?
Comment fait-on par programme pour stopper l'exécution d'un programme en cours ? Et pour avoir juste une pause de n secondes ? Ou demander à l'utilisateur d'appuyer sur la touche Entrée pour continuer ?
Ecrire une fonction testeFichier() qui utilise un paramètre nomDeFichier mais qui demande un nom de fichier si l'utilisateur ne passe pas de paramètre. On viendra ensuite tester si le fichier existe ou non. Y a-t-il une fonction R qui permet de choisir un nom de fichier via l'explorateur de fichiers du système de fichiers sous-jacent ?
Ecrire une fonction qui demande une spécification de fichiers et qui execute la fonction action() sur chacun des fichiers. On pourra réduire l'action à compter le nombre de lignes du fichier. Au passage, comment construire une liste automatique de fichiers comme "fic1.txt","fic2.txt","fic3.txt" ... (sans zéro de tête, chaines séparées) ? et comme "fic01.txt fic02.txt fic03.txt..." (avec zéro de tête, une seule chaine) ? Quelle est la «bonne» façon de nommer les fichiers ? Peut-on appliquer action() à un ensemble de fichiers, disons *.txt ?
Aides à lire : connections() et readLines().
Une archive de quelques fichiers-texte que vous pouvez utiliser pour cet exercice est nommée textes.zip.
Comment générer la liste de fichiers CompAliste.txt, CompBliste.txt... ? Comment vérifier si un fichier correspond au modèle fic44*num.pair.txt ? Et pour un vecteur de noms de fichiers ? Et pour une liste de noms de fichiers ?
Quelles sont les différences entres les objets R suivants :
- y~x
- lm(y~x)
- anova( lm(y~x) )
- summary( anova(lm(y~x)) )
Peut-on leur appliquer les fonctions print(), plot() et summary() et qu'obtient alors ?
Pour tester tout cela, on pourra utiliser les données HER, variables taille et poids.
Comme vous avez pu le constater dans l'exercice précédent, le comportement standard de R pour le tracé des résidus n'est pas toujours pratique et en tous cas, il n'est pas adapté à Rstudio : on demande confirmation avant de passer au tracé suivant, on ne trace que 4 diagnostics sur 6... Ecrire une fonction plotResidus(x,y,f) qui trace les 6 graphiques un à la fois et qui génére les 6 fichiers PNG associés si f n'est pas vide (f correspond au début des noms de fichier).
On réutilisera les données HER (variables taille et poids) puis les variables height et weight de wcgs.dar, qui correspondent à l'ouvrage de Vittinghoff et al. nommé Regression Methods in Biostatistics. Afficher avec une couleur différente les hommes et les femmes sera utile.
Faut-il ajouter l'ellipse à la fin de la liste des paramètres ?
Comment afficher proprement un vecteur sur n colonnes avec une largeur L et d décimales ? Ecrire une fonction enColonnes() qui utilise les paramètres vecteur,nbCol,largeur,nbDec dont voici un exemple d'utilisation :
> # démonstration de la fonction enColonnes > va <- runif(117) > print( head(va) ) [1] 0.07296829 0.67595836 0.69121984 0.06904545 0.25704291 0.70075787 > enColonnes(va) Affichage des 117 valeurs de "V" sur 4 colonnes, largeur= 7 avec 3 décimales 0.073 0.676 0.691 0.069 0.257 0.701 0.919 0.260 0.019 0.937 0.470 0.598 0.842 0.954 0.275 0.742 0.112 0.597 0.234 0.655 0.943 0.306 0.282 0.680 0.049 0.750 0.318 0.100 0.536 0.057 0.132 0.095 0.090 0.806 0.500 0.538 0.624 0.855 0.916 0.437 0.068 0.454 0.307 0.004 0.439 0.163 0.569 0.524 0.023 0.847 0.803 0.277 0.440 0.694 0.467 0.936 0.469 0.934 0.163 0.310 0.477 0.754 0.608 0.844 0.134 0.102 0.622 0.496 0.486 0.010 0.614 0.796 0.231 0.877 0.333 0.665 0.660 0.108 0.937 0.615 0.761 0.330 0.394 0.990 0.290 0.192 0.805 0.489 0.797 0.018 0.747 0.712 0.241 0.122 0.936 0.795 0.326 0.971 0.933 0.878 0.314 0.518 0.021 0.505 0.240 0.999 0.744 0.284 0.125 0.807 0.361 0.361 0.137 0.150 0.210 0.493 0.651 > # plus lisible que enColonnes(va,10,5,2) > enColonnes(vecteur=va,nbCol=10,largeur=5,nbDec=2) Affichage des 117 valeurs de "V" sur 10 colonnes, largeur= 5 avec 2 décimales 0.07 0.68 0.69 0.07 0.26 0.70 0.92 0.26 0.02 0.94 0.47 0.60 0.84 0.95 0.27 0.74 0.11 0.60 0.23 0.66 0.94 0.31 0.28 0.68 0.05 0.75 0.32 0.10 0.54 0.06 0.13 0.10 0.09 0.81 0.50 0.54 0.62 0.85 0.92 0.44 0.07 0.45 0.31 0.00 0.44 0.16 0.57 0.52 0.02 0.85 0.80 0.28 0.44 0.69 0.47 0.94 0.47 0.93 0.16 0.31 0.48 0.75 0.61 0.84 0.13 0.10 0.62 0.50 0.49 0.01 0.61 0.80 0.23 0.88 0.33 0.67 0.66 0.11 0.94 0.62 0.76 0.33 0.39 0.99 0.29 0.19 0.81 0.49 0.80 0.02 0.75 0.71 0.24 0.12 0.94 0.80 0.33 0.97 0.93 0.88 0.31 0.52 0.02 0.51 0.24 1.00 0.74 0.28 0.12 0.81 0.36 0.36 0.14 0.15 0.21 0.49 0.65Pourquoi peut-on se dispenser d'écrire une telle fonction ?
Pour quelle structure serait-ce intéressant d'afficher des blocs de colonnes ?
La commande par() donne, avec un affichage peu agréable, tous les paramètres graphiques. Ecrire une fonction parPrint() qui les affiche par ordre alphabétique et dont voici un exemple d'affichage (tronqué) :
Paramètre Longueur Valeur [1,] adj 1 0.5 [2,] ann 1 TRUE [3,] ask 1 FALSE [4,] bg 1 white [5,] bty 1 o [6,] cex 1 1 [7,] cex.axis 1 1 ... [69,] yaxt 1 s [70,] ylbias 1 0.1 [71,] ylog 1 FALSEUtilisez la même stratégie pour la commande options() ; on écrira une fonction optionsPrint() qui pourra trier par type d'information fournie ; en voici deux exemples d'affichage (tronqué) :
Toutes les options par ordre alphabétique ========================================= Option Type Longueur Valeur [1,] add.smooth logical 1 TRUE [2,] bitmapType character 1 cairo [3,] browser closure 1 <<function...>> [4,] browserNLdisabled logical 1 FALSE ... [45,] str list 3 strict.width=no digits.d=3 vec.len=4 ... [54,] warn double 1 0 [55,] warning.length integer 1 1000 [56,] width integer 1 150 Toutes les options par type puis par ordre alphabétique ======================================================= Option Type Longueur Valeur [1,] bitmapType character 1 cairo [2,] continue character 1 + [3,] contrasts character 2 contr.treatment contr.poly [4,] defaultPackages character 6 datasets utils grDevices graphics stats methods ... [26,] unzip character 1 /usr/bin/unzip [27,] browser closure 1 <<function...>> [28,] internet.info double 1 2 ... [34,] digits integer 1 7 [35,] expressions integer 1 5000 ... [38,] width integer 1 150 [39,] str list 3 strict.width=no digits.d=3 vec.len=4 [40,] add.smooth logical 1 TRUE ...Quels livres traitent de R et de SAS en synoptique ? Peut-on comparer R et SAS en termes de programmation ?
Retour à la page principale de (gH)