Valid XHTML     Valid CSS2    

Introduction à la programmation R (exercices)

Séance 5 : Sous-programmes : les fonctions

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

  1. Soulignés et encadrés

  2. Utilisation de sink() et source()

  3. Une fonction pour attendre

  4. Reproduire la fonction ifelse

  5. Une fonction anonyme pour gérer les NA ?

  6. Formater l'affichage d'un data frame

  7. Bien afficher par() et options()

 
Il est possible d'afficher toutes les solutions via ?solutions=1 et de toutes les masquer avec via ?solutions=0.

 

1. Soulignés et encadrés

R affiche les informations en mode texte et ce n'est pas toujours facile de trouver rapidement ce que l'on cherche dans les résultats d'exécution. Ecrire une fonction nommée souligne() qui souligne un texte passé en paramètre avec le symbole égal par défaut comme caractère de soulignement, ou avec un autre caractère passé en deuxième paramètre.

Serait-ce beaucoup plus difficile de réaliser un encadrement ?

Voici des exemples d'exécution pour illustrer ce qu'on voudrait réaliser.


     > souligne("Analyse statistique")
     
       Analyse statistique
       ===================
     
     > souligne(texte="Analyse numéro 2",avec="-")
     
       Analyse numéro 2
       ----------------
     
     > encadre("Exercices de programmation")
     
       + ========================== +
       +                            +
       + Exercices de programmation +
       +                            +
       + ========================== +
     

Solution :  

 

2. Utilisation de sink() et source()

Comment fait-on pour exécuter du code R en mode session, avec Rstudio ou en ligne de commandes shell ? Quelles sont les options d'exécution ? Comment obtenir un fichier "log" qui contient une copie dans un fichier texte de tout ce qui a été affiché ?

Après avoir lu l'aide sur les fonctions sink() et source(), expliquer ce que réalise la fonction sinksource() suivante et comment on s'en sert :


     #################################################################
     
     sinksource <- function(fName,encoding="latin1",split=TRUE,...) {
     
     #################################################################
     
     # mais que diable fait cette fonction ?
     
     baseName <- fName
     lng <- nchar(fName)
     if (substr(fName,lng-1,lng)==".r") {
       baseName <- substr(fName,1,lng-2)
     } # fin si
     
     fs  <- paste(baseName,".sor",sep="")
     fp  <- paste(baseName,".r",sep="")
     unlink(fs)
     
     sink(fs,split=split)
     source(fp,encoding=encoding,print.eval=TRUE,...)
     sink()
     
     cat("\n\n vous pouvez utiliser ",fs,"\n")
     
     } # fin de fonction sinksource
     

Solution :  

 

3. Une fonction pour attendre

On a de temps en temps besoin non pas d'interrompre mais de suspendre l'exécution et surtout l'affichage d'un programme, par exemple pour vérifier que les sorties correspondent à ce qu'on attendait. Ecrire une fonction attendre qui suspend le script, pose une question et continue le script si on appuie juste sur "Entrée" ou qui quitte le programme si on écrit quelque chose.

Solution :  

 

4. Reproduire la fonction ifelse

Afin de comprendre ce que fait la fonction R nommée ifelse(), écrire une fonction sialors qui utilise trois paramètres, condition, sioui, sinon et dont le comportement est le suivant :


     > ages <- c(10,50,8,20)
     
     > sialors(ages<20,"jeune","vieux")
     
     "jeune" "vieux" "jeune" "vieux"
     
     >  cbind( ages, sialors(ages<20,"jeune","vieux") )
     
     [1,] "10" "jeune"
     [2,] "50" "vieux"
     [3,] "8"  "jeune"
     [4,] "20" "vieux"
     
     

On rajoutera un test sur les paramètres : ainsi sialors() sans paramètre devra afficher une aide avec le rappel de la syntaxe et des exemples, comme par exemple :


     > sialors()
     
     fonction sialors(condition,sioui,sinon)
     
        on renvoie un vecteur avec "sioui ou "sinon"
        en fonction de "condition".
     
        exemple : sialors(ages<20,"jeune","vieux")
     
     

Peut-on consulter le code de la fonction ifelse() ?

Solution :  

 

5. Une fonction anonyme pour gérer les NA ?

On voudrait calculer les moyennes des colonnes d'un data frame sachant qu'il y a des valeurs NA, comme par exemple pour les données des colonnes 2 à 4 du fichier diabete.dar. Montrer que l'utilisation d'une fonction anonyme suffit. Peut-on s'en passer ?

Solution :  

 

6. Formater l'affichage d'un data frame

R sait assez bien formater une matrice de résultats numériques parce que toutes les colonnes sont numériques. Afficher "proprement" (avec un format particulier pour chaque colonne) un data.frame n'est vraiment prévu en R. Implémenter une fonction printdf qui prend en entrée deux paramètres df et fmt. df est bien sûr un data frame et fmt le format de chaque colonne au sens de sprintf().

Voici ce qu'on veut obtenir par exemple :


     > data(cars)
     
     > print( head(cars) )
       speed dist
     1     4    2
     2     4   10
     3     7    4
     4     7   22
     5     8   16
     6     9   10
     
     > printdf( head(cars),c("%02d","%5.1f") )
       speed  dist
     1    04   2.0
     2    04  10.0
     3    07   4.0
     4    07  22.0
     5    08  16.0
     6    09  10.0
     
     
     

Solution :  

 

7. Bien afficher par() et options()

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

Solution :  

 

 

Code-source php de cette page. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)