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 1 (solutions)

  1. Qu'est-ce que programmer en R par rapport à la programmation classique, disons en C, C++ ou Java ? Quelles différences avec la programmation Perl, Php, Ruby, Python ?

    Que faut-il programmer en R ? Quand doit-on programmer en R ?

    Pourquoi dit-on que tout est fonctionnellement objet en R, même les fonctions, l'affectation et l'indexation ?

  2. Comment définir une «fonction nommée» ?

    Définir une fonction nommée carre() qui calcule le carré d'un objet et expliquer comment on peut s'en servir sur les différentes structures de données de R.

    Application : définir une fonction nommée pvalt() qui renvoie la p-value d'un test t et l'appliquer à la comparaison des dix premières lignes des deux premières colonnes des données iris.

  3. Qu'appelle-t-on une «fonction anonyme» et comment s'en sert-on ?

    Application : comment calculer les moyennes en colonne d'un jeu de données avec des valeurs NA, comme par exemple les colonnes 2 à 4 du fichier diabete.dar sachant que la colonne Pnum est un identifiant ?

  4. Rappeler les types de données et les structures de données disponibles en R. On pourra utiliser les objets suivants (qu'on peut copier/coller dans une session R) :

    
          obj01  <- 1   # à ne pas confondre avec obj01 <- 1L avec un "L" en fin     
          obj02  <- 2.0     
          obj03  <- "Age"     
          obj04  <- TRUE     
          obj05  <- NA     
          obj06  <- Inf     
          obj07  <- NaN     
          obj08  <- 1:2     
          obj09  <- c(1,2)     
          obj10  <- c(obj01,obj02)     
          obj11  <- c(1,NA)     
          obj12  <- c(obj01,obj03)     
          obj13  <- list(obj01,obj02)     
          obj14  <- list(a=obj01,b=obj02)     
          obj15  <- function(x) { return( x*x ) }     
          obj16  <- vector(mode="integer",length="3")     
          obj17  <- array(data=1:4,dim=c(2:3))     
          obj18  <- matrix(data=1:6,nrow=2,ncol=3) # data=1:4 est incorrect     
          obj19  <- as.data.frame(obj17)     
          obj20  <- as.data.frame(obj18)     
              
              
    

    Au passage, comment supprimer les 20 objets créés ?

    Y a-t-il une autre valeur particulière en R ? Que vaut TRUE*TRUE ? Combien y a-t-il de fonctions de conversion ? et de test ? et d'affichage ? et de résumé ?

    Que vaut c(1,2,"3",4) ? Si m est une matrix de valeurs numériques, que fait m[1,2] <-"5" ?

  5. Comment appliquer un calcul à tous les éléments d'une structure ? Rappeler au passage la différence entre 1:3 et c(1,2,3), entre [i] et [[i]]. Donner un exemple d'utilisation de apply(), lapply(), mapply(), sapply(). Y a-t-il d'autres fonctions basées sur apply ?

    Expliquer les instructions suivantes :

    
          # les mots     
              
          ldm <-  unlist( strsplit(x="le chat mange la souris",split=" "))     
              
          # version courte     
              
          nchar(ldm)     
              
          # un peu mieux avec sapply ?     
              
          sapply(FUN=function(x) { nchar(x) },X=ldm)     
              
          # on n'est pas obligé de tout détailler     
              
          sapply(FUN=nchar,X=ldm)     
              
    

    Quel est le rapport entre tapply(), lapply() et split() ?

    Si mdata1, mdata2, mdata3... sont des dataframes comment obtenir la liste de tous les objets dont le nom commence par mdata ? Comment avoir rapidement leurs dimensions ?

  6. Exécuter avec un papier et un crayon les instructions suivantes et détailler ce qu'on obtient.

    
         # partie 1     
              
           a   <- 12     
           b   <- 3     
           sov <- list(a=a,b=b)     
           a   <- sov$b     
           b   <- sov$a     
              
         # partie 2     
              
           a   <- a + b     
           b   <- a - b     
           a   <- a - b     
              
         # partie 3     
              
           c  <-  5     
           p  <- min(a,min(b,c))     
           g  <- max(a,max(b,c))     
           m  <- max( min(a,b), min(a,c) )     
              
         # partie 4     
              
           a  <- 8     
           b  <- 6     
           pg <- 0     
           if (a<b) {     
              pg <- c(a,b)     
           } # fin de si 1     
              
           if (a<b) {     
              p <- a     
              g <- b     
           } else {     
              p <- b     
              g <- a     
           } # fin de si 2     
              
         # partie 5     
              
           pg <- (-1)     
           p  <- (-2)     
           g  <- (-3)     
           if (a<b) # attention 1     
              pg <- c(a,b)     
              
           if (a<b) # attention 2     
              p <- a     
              g <- b     
              
           if (a<b) # attention 3     
              p <- a     
              g <- b     
           else     
              p <- b     
              g <- a     
              
              
              
    
  7. Quelles fonctions de R permettent d'éviter de programmer si l'on veut :

    • trouver la [première] position du maximum dans un vecteur,
    • dichotomiser une vecteur (par exemple pour répartir des valeurs d'age en deux classes "jeune" et "vieux"),
    • calculer les moyennes, mininima, maxima et écart-types des colonnes d'une matrice,
    • diviser chaque ligne d'une matrice par sa somme [en ligne],
    • convertir une colonne d'un data frame (par exemple de pouces en cms) ?

    On génèrera, pour tester les calculs correspondants, un vecteur d'entiers, une matrice d'entiers, un dataframe. Pour ce dernier, on viendra, toujours sans programmation, produire des noms de ligne comme Ind_001, Ind_002...

  8. Comment fait-on pour numéroter rapidement les éléments d'une structure, d'un vecteur par exemple, ou les noms de colonne d'une matrice ou d'un dataframe ?

  9. Quel choix a-t-on pour définir et utiliser les paramètres d'une fonction ? Qu'est-ce que l'ellipse notée ... ?

    Comment tester si les paramètres d'une fonction sont présents ? Pourquoi dit-on qu'une fonction en R est une variable ?

    Quel choix a-t-on pour renvoyer les valeurs calculées par une fonction ? A quoi sert la fonction invisible() ?

  10. Détailler ce qui se passe pour l'extrait de session R suivante :

    
          # définition des fonctions     
              
          carre <- function(x) { return(x*x) } # pour mémoire     
              
          f <- function(x) carre(x)     
              
          g <- function(x=NA) {     
            if (is.list(x)) {     
              return( lapply(x,carre)  )     
            } else {     
              return( carre(x) )     
            } # fin de si     
          } # fin de fonction g     
              
          h <- function(x=NA,graphique=FALSE,...) {     
            if (is.list(x)) {     
              return( lapply(x,carre)  )     
            } else {     
              y <- carre(x)     
              if (graphique) {     
                plot( y, ...)     
              } # fin de si sur graphique     
              return( y )     
            } # fin de si sur is.list     
          } # fin de fonction h     
              
          # utilisation des fonctions     
              
          f     
          # not run: f()     
          f(3)     
          f(1:5)     
          # not run: f(list(a=2,b=2))     
              
          g()     
          g(3)     
          g(list(a=2,b=2))     
              
          li <- list(a=2,b=2)     
              
          h     
          h()     
          h(3)     
          h(1:5)     
          h(li)     
          h( 1:5, TRUE )     
          h(x=1:5, graphique=TRUE )     
          h(x=1:5, graphique=TRUE,col="red",pch=20 )     
              
    

    Rappeler au passage comment on se sert de source() et de sink(). Que fait la fonction sinksrc() qui fait partie de statgh.r ?

  11. Rappeler les actions élémentaires de controle de flux.

    Ecrire une boucle avec un test pour déterminer le maximum d'un vecteur puis écrire une deuxième boucle pour compter combien de fois on trouve ce maximum. Réécrire cela en une seule boucle puis trouver une solution sans boucle.

  12. Comment connaitre la liste des objets d'un package avec leur classe ? On écrira une fonction ls2() qu'on appliquera à "base" puis à "stats" et à "utils".

    Dans le même genre d'idées, comment connaitre les différents jeux de données d'un package avec leur(s) classe(s) et leur(s) dimension(s) ? On écrira une fonction data2() qu'on appliquera à "datasets" puis à "ade4". On s'arrangera pour "bien" afficher la dimension des objets.

  13. Comment choisir entre plusieurs implémentations d'une fonction qui réalisent la même action ? Pourquoi faut-il privilégier les actions vectorielles de R ? Quelles sont les autres bonnes pratiques en R ? Ecrire une fonction duree() pour savoir combien de temps dure l'éxécution d'une commande, d'un script...

  14. Voici une liste de livres qui traitent de R :

    non su non su non su non su
    MSwR&R DA&GUR The R book R in action
    non su non su non su non su
    Use R! series R graphics R graphs cookbook Takezawa
    fleche
    non su non su non su non su
    Hojsgaard, Edwards, Lauritzen Shahbaba Paradis Suess, Trumbo
    non su non su non su non su
    Foulkes Ritz, Streibig Hahne, Huber, Gentleman, Falcon Claude

    Quels autres livres peut-on lire sur R en général et en français ? et sur la programmation en R ? Ou quels autres documents du Web ?

  15. Quel(s) site(s) Web en français donne(nt) la syntaxe des fonctions de base de R rangées par catégorie ?

    Quels sites Web anglais ou français sont dédiés à R en-dehors du CRAN ?

    Trouve-on sur Youtube des vidéos pour apprendre à utiliser R ?

    Quels sites permettent de trouver des fonctions ou des packages par mot-clé ?

 

 

retour gH    Retour à la page principale de   (gH)