Valid XHTML     Valid CSS2    

 

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)

  1. 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} $

  2. 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.

  3. Implémenter la fonction posMin() qui renvoie toutes les positions du minimum avec une boucle puis sans boucle. Comment optimiser le calcul ?

  4. 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é ?

  5. 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 ?

  6. 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 ?

  7. 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.

  8. 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 ?

  9. 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.

  10. 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 ?

  11. 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.65     
              
              
    

    Pourquoi peut-on se dispenser d'écrire une telle fonction ?

    Pour quelle structure serait-ce intéressant d'afficher des blocs de colonnes ?

  12. 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        FALSE     
              
    

    Utilisez 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     
         ...     
              
    
  13. Quels livres traitent de R et de SAS en synoptique ? Peut-on comparer R et SAS en termes de programmation ?

 

 

retour gH    Retour à la page principale de   (gH)