library(learnr) library(knitr) library(rio) library(skimr) knitr::opts_chunk$set(echo = TRUE) library(tidyverse) dir.create(paste0(tempdir(),"/data")) dir.create(paste0(tempdir(),"/data/chapitre_secret")) file.copy(from = system.file(package = "funcampR","data","chapitre14/gcoc_crypt.txt"), to = paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))
ancien_parchemin <- import(paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))
ancien_parchemin <- import(paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))
Pour trouver le mot magique qui permettra de faire apparaître le chemin vers le nouveau village, nous allons devoir user de magie pour remettre à leur place les éléments de l'ancien parchemin.
Ce parchemin est déjà chargé, sous le nom de ancien_parchemin
.
Souvenez-vous du chapitre 2 du grimoire IGoR : nous avions appris à découvrir le contenu des livres de comptes avec des sortilèges élémentaires :
head()
pour découvrir les premières lignesnames()
pour avoir le nom des colonnesnrow()
pour connaître le nombre de lignes. Allons-y !
Découvrons les premières lignes du parchemin avec le sortilège head()
:
head(ancien_parchemin)
A vous de jouer !
# découvrir les premières lignes du parchemin à l'aide du sortilège head # fin de l'exercice
# découvrir les premières lignes du parchemin à l'aide du sortilège head head(ancien_parchemin) # fin de l'exercice
Ce parchemin semble vraiment complexe !
Essayons de voir le nom des colonnes avec le sortilège names()
:
names(ancien_parchemin)
A vous de jouer !
# afficher le noms des colonnes du parchemin à l'aide du sortilège names # fin de l'exercice
# afficher le noms des colonnes du parchemin à l'aide du sortilège names names(ancien_parchemin) # fin de l'exercice
Diantre, 168 colonnes ! Ah nous voyons tout de même une certaine logique, certaines commencent par 'col' et d'autres par 'sup', intéressant...
Grâce à la plume tidyverse
, nous pourrons utiliser les sorts puissants de la magie dplyr
Pour utiliser cette plume, nous devons l'invoquer en écrivant 'library(tidyverse)' au début du programme R.
library(tidyverse)
Maintenant, nous allons pouvoir utiliser les sortilèges apportés par dplyr
pour manipuler le parchemin.
select
Lorsque l'on a un parchemin aussi complexe, il est pratique de choisir de ne travailler que sur certaines colonnes. Pour cela on utilise le sortilège select()
.
Afin de ne conserver que les colonnes id
et garde
, voici comment utiliser le sortilège select()
:
select(ancien_parchemin, id, garde)
N'oublions pas qu'il est possible d'utiliser le pipe %>% pour d'enchaîner les sortilèges.
# utilisation du select() avec l'opérateur permettant d’enchaîner les sortilèges ancien_parchemin %>% select(id, garde)
A vous de jouer : sélectionner les colonnes id
et sup1
du parchemin
# sélectionner les colonnes id et sup1 de ancien_parchemin # fin de l'exercice
# sélectionner les colonnes id et sup1 de ancien_parchemin ancien_parchemin %>% select(id, sup1) # fin de l'exercice
Il est aussi possible d'utiliser le sortilège select pour exclure certaines colonnes en indiquant un '-' devant le nom de la colonne.
Par exemple, pour retirer la colonne id
du parchemin, nous lancerons le sortilège select(-id)
:
# select permettant de retirer la colonne id # NB : le sortilège head a été ajouté pour alléger (un peu) l'affichage (on n'affiche que les 6 premières lignes) ancien_parchemin %>% select(-id) %>% head()
La magie de dplyr est extrêmement puissante ! Et encore plus si l'on utilise les charmes pour augmenter la puissance des sortilèges !
Voyons comment faire.
Les charmes envoûtent les ingrédients et permettent d'augmenter la puissance des sortilèges.
Par exemple, le charme starts_with
permet au sortilège select
de sélectionner non pas juste une colonne mais toutes les colonnes commençant par...
# sélection des colonnes dont le nom commencent par "sup" ancien_parchemin %>% select(starts_with("sup"))
Voici les charmes (aussi appelé en langage runique helpers) les plus connus à utiliser avec le sortilège select
:
starts_with("xxx")
: commençant par "xxx"ends_with("xxx")
: finissant par "xxx"contains("xxx")
: contenant "xxx"matches("^col.*1$")
: vérifiant l'expression régulière : commençant par "col" (^col), suivi de plusieurs caractères quelconques (.*) et finissant par 1 (1$). Les expressions régulières sont de la magie noire réservée aux sorciers les plus téméraires.num_range("xxx",2:5)
: colonnes dont le nom est "xxx1", "xxx2", "xxx3", "xxx4","xxx5"Exemple : pour sélectionner les colonnes sup10, sup11, sup12, sup13 ... sup19, nous pouvons lancer le sortilège :
# sélection des colonnes dont le nom commencent par "sup1" # le sortilège head a été ajouté pour alleger (un peu) l'affichage ancien_parchemin %>% select(starts_with("sup1")) %>% head()
On remarquera que les colonnes gardent leur ordre d'origine. Pour réordonner les colonnes, il faut les appeler dans le bon ordre !
# sélection des colonnes sup10,sup11, sup12,sup13,sup14,sup15 # le sortilège head a été ajouté pour alléger (un peu) l'affichage ancien_parchemin %>% select(sup10,sup11, sup12,sup13,sup14,sup15) %>% head()
Ce que le charme num_rang
permet de faire rapidement : il construit une liste de noms de colonnes de type "prefixe" + numéro
# sélection des colonnes dont le nom sup10,sup11, sup12,...,sup19 # le sortilège head a été ajouté pour alléger (un peu) l'affichage ancien_parchemin %>% select(num_range("sup",10:19)) %>% head()
À vous de jouer : Selectionner les colonnes col1, col2, col3, col4, col5 !
# Sélectionner les colonnes col1, col2, col3, col4, col5 # fin de l'exercice
# Selectionner les colonnes col1, col2, col3, col4, col5 ancien_parchemin %>% select(num_range("col", 1:5)) # fin de l'exercice
Retournons à notre parchemin et regardons maintenant les lignes qui le composent
Affichons d'abord les 10 premières lignes à l'aide du sortilège head()
A vous de jouer : afficher les 10 premières lignes de l'ancien parchemin !
# afficher les 10 premières lignes de ancien_parchemin avec le sortilège head() # fin de l'exercice
# afficher les 10 premières lignes de ancien_parchemin avec le sortilège head() ancien_parchemin %>% head(10) # fin de l'exercice
id
semble être un numéro de classement.
Trions les lignes du parchemin par valeur croissante de la colonne id
.
A vous de jouer : trier le parchemin selon l'id croissant (sortilège arrange()
) :
# Trier les lignes de ancien_parchemin selon id croissant à l'aide du sortilège arrange # fin de l'exercice
# Trier les lignes de ancien_parchemin selon id croissant à l'aide du sortilège arrange ancien_parchemin %>% arrange(id) # fin de l'exercice
Certaines lignes semblent être protégées par des gardes. Ce sont sûrement les plus précieuses. Concentrons-nous sur elles !
Avec le sortilège filter()
, filtrons les lignes afin de ne conserver que les lignes avec garde à "Oui" (opérateur ==)
# Conserver les lignes avec garde=="Oui" de ancien_parchemin à l'aide de filter() # fin de l'exercice
# Conserver les lignes avec garde=="Oui" de ancien_parchemin à l'aide de filter() ancien_parchemin %>% filter(garde=="Oui") # fin de l'exercice
Maintenant que nous nous sommes entraînés, décryptons le parchemin grâce aux indices donnés par les généraux de Lériva.
À vous de prendre la plume !
# A partir des données de l'ancien_parchemin, # (i) Conserver les lignes utiles # (ii) Réordonner les lignes (par id croissant) # (iii) Sélectionner uniquement les colonnes avec le préfixe col dans le bon ordre # fin de l'exercice
# A partir des données de l'ancien_parchemin, # (i) Conserver les lignes utiles # (ii) Réordonner les lignes (par id croissant) # (iii) Sélectionner uniquement les colonnes avec le préfixe col dans le bon ordre ancien_parchemin %>% filter(garde=="Oui") %>% arrange(id) %>% select(num_range("col", 1:83)) # fin de l'exercice
Le parchemin se décrypte enfin ! .... mais reste dans la nébuleuse magique. Des trous (NA) multiples rendent la lecture difficile.
Afin de pouvoir lire paisiblement le résultat, nous allons l'inscrire sur un feuillet.
Pour cela il nous faut
write_delim()
qui occultera les valeurs manquantes (NA) et autres informations inutiles.Le sortilège write_delim() utilise :
des ingrédients optionnels pour agrémenter la recette comme:
Par exemple voici comment écrire le parchemin trié sur un feuillet :
#utilisation de la plume library(readr) # écriture du parchemin sur le feuillet, # - en collant les données (séparateur "") # - en remplaçant les Valeurs manquantes par des espaces na=" ") # - en ne mettant pas les noms des colonnes ancien_parchemin %>% filter(garde=="Oui") %>% arrange(id) %>% select(num_range("col", 1:83)) %>% write_delim("/tmp/feuillet.txt", delim = "", na = " ", col_names = FALSE)
À vous de jouer : écrivez dans le feuillet "/tmp/feuillet.txt" , le parchemin décrypté
# (i) Conserver les lignes avec garde=="Oui" # (ii) Trier les lignes sur id ascendant # (iii) Sélectionner les colonnes col1 à col83 # (iv) Ecrire le parchemin décrypté dans un feuillet avec les ingrédients delim = "",na = " ",col_names = FALSE # fin de l'exercice
# (i) Conserver les lignes avec garde=="Oui" # (ii) Trier les lignes sur id ascendant # (iii) Sélectionner les colonnes col1 à col83 # (iv) Ecrire le parchemin décrypté dans un feuillet avec les ingrédients delim = "",na = " ",col_names = FALSE library(readr) ancien_parchemin %>% filter(garde=="Oui") %>% arrange(id) %>% select(num_range("col", 1:83)) %>% write_delim("/tmp/feuillet.txt",delim = "",na = " ",col_names = FALSE) # fin de l'exercice
downloadLink("downloadFic", "Téléchargez le fichier feuillet.txt")
output$downloadFic <- downloadHandler( filename = function() { "feuillet.txt" }, content = function(file) { file.copy("/tmp/feuillet.txt", file) })
Ouvrez le fichier feuillet.txt et découvrez le mot magique !
question("Le mot magique est :", type="single", allow_retry = TRUE, incorrect="Retente ta chance", answer("Phocea"), answer("PorteEst",correct=TRUE), answer("Menpenti"), answer("SuperDR"), correct="Félicitations, la réponse à donner à Lériva est donc : PorteEst (sans espace et avec P et E majuscules)" )
Vous avez trouvé ? Reportez la réponse dans le jeu Icarius pour reprendre la partie...
Fin du chapitre >> reprenez la partie d'Icarius !!!
Version testcore 0.6
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.