Thursday 4th of March, 2021
teachers: Claire Vandiedonck & Magali Berland; helpers: Antoine Bridier-Nahmias, Yves Clément, Bruno Toupance, Jacques van Helden
Objectifs pédagogiques de ce practical qui est facultatif:
Rappels
Les exercices proposés sont donnés dans un ordre progressif qui suit celui du diaporama associé. Ils ont des niveaux de difficulté variable. Pour chaque exercice, des fonctions R vous sont suggérées. N’hésitez pas à consulter leur menu d’aide en tapant soit
?nom_fonction
, soithelp(nom_fonction)
. Vous pouvez parvenir aux mêmes résultats avec d’autres commandes. Les commandes les plus courtes sont en général les meilleures. Une correction détaillée sera fournie.Vous pouvez réaliser ces exercices directement dans ce notebook en indiquant votre code dans les cellules laissées libres. Pour ajouter une nouvelle cellule, cliquez simplement sur le
+
dans le menu en haut à gauche du notebook (cf. rappels sur les notebooks en bas de ce notebook). Vous pouvez mettre plusieurs lignes de code aussi par cellule. Pour executer les cellules, cliquez surShift+Enter
. Executez les dans le bon ordre.Remarque: dans un notebook jupyter, par défaut chaque élément d'un vecteur est affiché séparé par un ".". Si vous souhaitez afficher le vecteur de façon plus classique, c'est à dire en ligne, tel qu'il apparait dans R, il est nécessaire d'utiliser la fonction
print()
-> voir dans cet exemple avec un vecteur contenant les deux valeurs numériques 1 et 10.
my_vector <- c(1, 10) # pour générer le vecteur et l'assigner dans un objet "my_vector"
my_vector # l'affichage ici montre deux éléments, chacun dans une ligne différente
print(my_vector) # L'affichage ici montre le vecteur par ligne avec l'indice 1 entre crochets indiquant l'indice de la première valeur de la ligne.
Vous pouvez également réaliser ces exercices si vous le préférez dans un terminal, une console ou rstudio.
Il est enfin possible de réaliser ces exercices sur votre ordinateur. Dans ce cas, utilisez un editeur de texte avec coloration syntaxique pour votre code (editeur dans Rstudio, ou Tinn-R ou notepad++ par exemple). Sauvegardez vos commandes dans un fichier mes_commandes.R dans le répertoire de votre choix. Exécutez les commandes une par une dans votre console. Vous pouvez ajouter des commentaires qui ne seront pas éxécutés si vous les précédez du caractère « # ».
Avant toute chose
Avant de démarrer les exercices, sauvegardez une copie de ce notebook pour backup.
getwd()
Si ce répertoire ne vous convient pas, changer le pour un répertoire existant my_directory
par exemple, avec la commande suivante en spécifiant le chemin relatif ou absolu de votre répertoire:
setwd("path/my_directory")
sessionInfo()
Créez un vecteur de 100 valeurs tirées aléatoirement selon une loi normale de moyenne 4 et d’écart type 5.
Identifiez les indices des valeurs strictement supérieures à 3 et récupérez les valeurs correspondantes.
Testez si la somme de ces valeurs est supérieure à 40, à 30 ou à 20 et affichez un message adéquat selon chaque éventualité.
Tip :fonctions recommandées : rnorm()
, which()
, sum()
, if()
, ifelse()
, else()
, cat()
ou print()
vecRandom <- rnorm(100, mean = 4, sd = 5)
vecAbove3 <- vecRandom[which(vecRandom > 3)]
valSum <- sum(vecAbove3)
if(valSum > 40){
cat("la somme est > 40 \n")
}else if(valSum > 30){
cat("la somme est > 30 mais <= 40 \n")
}else if(valSum > 20){
cat("la somme est > 20 mais <= 30 \n")
}else{
cat("la somme est < ou egal 20 \n")
}
=> Pour aller plus loin:
vous pouviez aussi obtenir le vecteur vecAbove3 avec la fonction ifelse()
:
identical(vecRandom[ifelse(vecRandom >3, TRUE, FALSE)] , vecRandom[which(vecRandom > 3)]) # exemple ici où je compare en plus si le résultat est bien le même
i
qui affiche à chaque itération l’indice i
.Tip :
fonction recommandée : for()
, cat()
ou print()
sumCumul <- 0 # initiate the vector
for(i in 1:10){
print(i) # always print the index of the result, we might prefer cat(), see below
sumCumul <- sumCumul + i
cat(paste("for i:", i, " ,the sumCumul is: ", sumCumul, "\n", sep=""))
}
# affichage de la somme cumulee finale
print(sumCumul)
Tip :fonction recommandée : function()
, return()
calculSomme <- function(x, y){
return(x + y)
}
-> Test de la fonction avec par exemple 18 et 35:
calculSomme(x = 18, y = 35)
=> Pour aller plus loin:
Si vous voulez, vous pouvez definir avant un vecteur qui contiendra le resultat de la somme
sum_xandy <- NULL
calculSomme <- function(x, y){
sum_xandy <- x+y
return(sum_xandy)
}
sum_xandy <- calculSomme(x = 18, y = 35) # le resultat est stocké dans l'objet sum_xandy qui n'est plus NULL
sum_xandy # affichez le resultat
Si maintenant, vous voulez répeter l'operation et stocker les resultats dans un vecteur, il faut concatener les resultats dans un vecteur
sum_xandy <- NULL
calculSomme <- function(x, y){
sum_xandy <- c(sum_xandy, x+y)
return(sum_xandy)
}
sum_xandy <- calculSomme(x = 18, y = 35)
sum_xandy <- calculSomme(x = 20, y = 35)
sum_xandy <- calculSomme(x = 18, y = 3)
# le resultat est stocke dans l'objet sum_xandy qui n'est plus NULL
print(sum_xandy)
calculTarif()
qui prend pour argument un âge et affiche “demi-tarif” si l’âge est inférieur à 12 ans, “tarif sénior” si l’âge est supérieur ou égal à 60 ans et “plein tarif” sinon.Tip :fonctions recommandées : function()
,
return()
,
print()
,
c()
,
if()
,
else()
,
ifelse()
,
for()
calculTarif <- function(age){
if(age < 12){
print("tarif reduit")
}else if(age >= 60){
print("tarif senior")
}else{
print("plein tarif")
}
}
-> test de la fonction
for(i in c(5, 65, 85, 41, 23, 47)){
calculTarif(age = i)
}
Ecrivez une fonction sumCumul()
qui calcule la somme cumulée des nombres entiers compris entre deux bornes a et b que vous mettrez en arguments start et end.
De plus, toutes les 10 boucles, vous affichez la valeur de l’entier ajouté, sinon vous affichez un point ..
Testez la fonction avec les entiers entre 3 et 55 par exemple.
Améliorez la fonction en ajoutant un paramètre "interval" correspondant à l’incrément de boucles entre les affichages des entiers (dans la fonction précédente, cet incrément était de 10)
Testez la fonction avec les entiers entre 3 et 55 et un intervalle de 15 par exemple.
Tip :fonctions recommandées : function()
,
return()
,
cat()
,
seq()
sumCumul <- function(start,end){
temp <- 0
for(i in start:end){
temp <- temp + i
if (i %in% seq(start,end,10)){
cat(i)
}
else {cat(".")}
}
cat("\n")
cat(paste("le total cumule est de: "), temp, "\n",sep="")
return(temp)
}
-> test de la fonction avec les entiers 3 et 55:
res <- sumCumul(3,55)
=> Pour aller plus loin:
Voici la fonction ameliorée avec un intervalle en argument:
sumCumul <- function(start,end, interval){
temp <- 0
for(i in start:end){
temp <- temp + i
if (i %in% seq(start,end,interval)){
cat(i)
}
else {cat(".")}
}
cat("\n")
cat(paste("le total cumule est de: "), temp, "\n",sep="")
return(temp)
}
res <- sumCumul(3,55,15)
res <- sumCumul(3,55,20)
Rappels sur l'utilisation des notebooks