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)
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 ?
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.
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 ?
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" ?
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 ?
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 <- aQuelles 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...
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 ?
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() ?
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 ?
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.
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.
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...
Voici une liste de livres qui traitent de R :
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 ?
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 à la page principale de (gH)