-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCSU_RepRo.Rmd
1089 lines (731 loc) · 25.4 KB
/
CSU_RepRo.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: 'Science Reproductible avec un grand `r icons::fontawesome("r-project")`'
subtitle: "slides : [tinyurl.com/ycktp4kv](https://tinyurl.com/ycktp4kv)"
author: "Maxime Jaunatre"
institute: "UR LESSEM | INRAE"
date: "2022-03-17 (updated: `r Sys.Date()`)"
output:
xaringan::moon_reader:
lib_dir: libs
css: [default, metropolis, metropolis-fonts]
nature:
highlightStyle: github
highlightLines: true
highlightSpans: true
countIncrementalSlides: false
---
```{r setup, include=FALSE}
library(emo)
library(icons)
options(htmltools.dir.version = FALSE)
knitr::opts_chunk$set(echo = FALSE, fig.align = "center")
```
```{r, eval = FALSE, inclue = FALSE}
# This are the dependencies to compile this rmd.
remotes::install_github("mitchelloharawild/icons")
icons::download_fontawesome()
remotes::install_github("hadley/emo")
```
exclude: true
class: inverse, center, middle
# Introduction
---
exclude: true
# Science Reproductible avec un grand R
**Résumé :** Le logiciel R est un outil indispensable aux recherches menées au sein d'AMURE.
Dans le contexte du mouvement de la science ouverte, Qu'il s'agisse d'analyse de données, de statistique ou de modélisation, se pose la question de la reproductibilité de la science : sommes nous tous capables de réutiliser les outils développés il y a 6 mois, un an ou plus ? Ces outils sont-ils suffisament ouverts pour permettre une utilisation par tout à chacun ? Enfin, à quoi peuvent bien servir des données ouvertes si les outils qui les utilisent ne le sont pas ?
Cette présentation fera un tour d'horizon des bonnes pratiques sous R et des outils qu'il propose afin de faciliter une production quotidienne de science reproductible et ouverte. Au programme : Rstudio, packages, Git/Github, données, documentation.
---
exclude: false
# Objectif : bonnes pratiques en R
## `r icons::fontawesome("r-project")` : Construit par et pour des statisticiens.
- Majorité d'utilisateurs non informaticiens.
- Bonne pratiques de *software engineering* diffusent dans la communauté.
???
Peu d'utilisateurs sont des informaticiens et n'ont pas les réflexes
de développement logiciel.
L'apprentissage se fait par la communauté et toutes les ressources disponibles
(présentations, blogs, livres).
--
.pull-left[
Formation personnelle : Apprentissage de R pour l'**écologie**, traitements de données.
Bonnes pratiques viennent des échanges, de la communauté et de la pratique.
]
.pull-right[
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/primula.jpg")
```
]
???
Exemple : mon parcours de biologie ne m'a pas donnée les bases d'informatique
par rapport a mon expérience de terrain en écologie.
Beaucoup de formation indépendante en autonomie.
Importance de travailler sur de petits projets persos et de se tenir au courant
des nouveautés de la communauté. S'impliquer.
Je vais aussi présenter plein de choses que j'ai apprises, ou qui existents.
L'important n'est pas de tout tester d'un coup mais d'incorporer aux méthodes
de travail au fur et a mesure.
--
.footnote[
On ne va pas parler de statistiques aujourd'hui.
]
???
Et les diapos contiennent le minimum de code.
---
# Reproductibilité ?
.pull-left[
Pouvoir reproduire une analyse, une figure ou des données efficacement !
##Principe FAIR :
.pull-left[
- **F**indable
- **A**ccessible
]
.pull-right[
- **I**nteroperable
- **R**eusable
]
]
???
Le principe FAIR a été expliqué auparavant pour l'ouverture des données
mais de nombreux parallèles peuvent être utilisés pour le code source.
La présentation va suivre l'ordre FAIR et partir du niveau dossier vers
une organisation en fichiers.
--
.pull-right[
```{r, out.width="65%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/repro_meme.jpg")
```
]
--
```{r, out.width="90%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/repro-spectrum.jpg")
```
.footnote[
Figure : [Peng. "Reproducible Research in Computational Science". In: *Science* (2011).](https://www.science.org/doi/10.1126/science.1213847)
]
???
Encore une fois, chaque projet se place sur ce spectre et peut s'améliorer par
de petits ajouts. Pas besoin d'utiliser toute ce qui est présenté.
Le mieux est d'inserer ces bonnes pratiques dès le début des projets.
---
# Findable 🔍
**Un donnée ou une figure non liées au code qui l'a produit n'est pas reproductible.**
L'emplacement du code doit être explicite. Le trouver ne doit pas être une aventure.
.pull-left[
Cela passe par quelques conseils :
- Noms de scripts explicites. <br/> (on évite les noms comme **test**, **test2**)
- Structure de dossier, **Compendium**
- Disque réseau et/ou en ligne
- Dossier avec noms de **projets** <br/> (sans espaces et accents !)
<!-- ? expliciter la location du code dans les rapports etc. toujour lier les données aux scripts qui les ont fait. (localité, sources etc) -->
]
.pull-right[
```{r, out.width="90%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/find_source.jpg")
```
- Logiciel de control de version (**git**)
]
```{r, echo=TRUE}
list.files()[1:4]
```
???
Bien nommer et placer ses dossiers est important, il ne faut pas perdre de temps
à chercher ses petits scrips.
Les espaces et les accents sont pénibles quand on partage nos dossiers
avec d'autres gens (norme anglophone) et pour l'utilisation d'outils de recherche
d'information (outils linux, grep et scripts R -> norme ASCII)
L'organisation en compendium est détaillée dans la partie "accessible"
Git est detaillé dans les diapos suivantes.
Trouver "géographiquement" le code mais aussi temporellement avec git.
---
exclude: false
# Pourquoi utiliser un CVS ?
Est-ce que vous avez déjà :
- **Fait un changement de code et voulu revenir en arrière ?**
- **Perdu du code ou une sauvegarde trop ancienne ?**
- Voulu voir la difference entre 2 versions ?
- Voulu vérifier l'historique d'un script ?
- **Voulu travailler sur un script a plusieurs ?**
- **Voulu partager votre code à quelqu'un ?**
- Voulu tester une nouveauté sans modifier du code déjà utile ?
Si oui, et dans plein de cas, un système de version control aurait pu vous simplifier la vie.
???
Diapo dite à l'orale avec le comic suivant.
---
background-image: url(./CSU_RepRo_files/figure-html/phd101212s.png)
background-size: contain
# Pourquoi utiliser un CVS ?
???
Multiplier les versions sur un ordi n'aide pas à retrouver facilement le code
---
layout: true
# Git : comment ça marche ?
---
## 3 commandes à retenir : commit, push, and pull
- commit: enregistre une snapshot du code à un certain point temporel.
<br/>(permet d'associer du texte pour expliquer les modifications)
```{r, out.width="50%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/git_tab.png")
```
???
Installation de git sur l'ordinateur et initialisation de dépots dans un dossier
rejoint la notion de compendium (un projet = un dépot git = un dossier)
commit permet un enregistrement d'une étape temporelle pour les fichiers textes
permet de travailler sur tout fichier texte simple (md, tex, R, code...)
Important de bien nommer ses commits pour se retrouver temporellement
--
- pull: met a jour le projet local avec la dernière version du projet<sup>*</sup>
- push: met en commun les modifications locales avec le projet principal<sup>*</sup>
.footnote[
[*] Si herbergé en ligne.
]
???
Important : git est indépendant de github et peut s'utiliser en solitaire.
pull et push permet de mettre à jour un dépot par rapport à un autre,
souvent en ligne.
---
```{r, out.width="85%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/commit_mess.png")
```
.footnote[
xkcd comics, [CC BY-NC 2.5 license](https://xkcd.com/license.html)
]
???
commit = doc temporelle, important de pas nommer n'importe comment sinon on s'y
perd.
---
## Sauvegarder en ligne ?
```{r, out.width="85%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/git.svg")
```
???
Github est juste un serveur web avec git d'installer dessus et qui peut
fonctionner comme un drive.
Permet de travailler à plusieurs ordinateurs (une personne) ou du coup à
plusieurs.
Important de commencer seul sur un petit projet pour appréhender le systeme
Github = Microsoft (GAFAM)
---
exclude: true
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/gitlab/gitlab_ifremer.png")
```
**Connection avec login extranet**, possibilité de partager à des membres externes.
???
gitlab est une alternative, moins répandue mais plus souveraine.
Ifremer héberge un gitlab et quelques universités également.
quoi qu'il arrive les dépots github/gitlab peuvent être totalement privés.
---
exclude: true
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/gitlab/create_proj.png")
```
---
exclude: true
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/gitlab/init_project.png")
```
???
On peut gérer l'acces aux projets et l'ouvrir au public ou non.
Permet de travailler sur des manuscrits par exemple.
---
layout: false
# Ressources Git
.pull-left[
- [Tutoriel ThinkR : R and Git](https://thinkr.fr/travailler-avec-git-via-rstudio-et-versionner-son-code/)
- [Advance R 📔, H. Wickham](http://r-pkgs.had.co.nz/git.html)
- [Happy Git and GitHub for the useR](http://happygitwithr.com/)
- [Git cheatsheet](https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf)
- [Quand ça part en vrille](https://github.com/k88hudson/git-flight-rules)
- [Réparer une erreur](http://ohshitgit.com/)
- [Créer une nouvelle branche avec git et merge des branches](https://github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches)
]
.pull-right[
```{r, out.width="90%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/git.png")
```
]
.footnote[
xkcd comics, [CC BY-NC 2.5 license](https://xkcd.com/license.html)
]
???
Beaucoup d'information est disponible.
Encore une fois, il vaut mieux commencer sur un petit projet où l'on est à
l'aise.
---
layout: true
# Accessible 📂
---
## COMPENDIUM 📦
.pull-left[
Structurer les dossiers en packages R.
```{r, out.width="65%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/mar_scompd.png")
```
[Marwick et al. "Packaging Data Analytical Work Reproducibly Using R (and Friends)". In: *The American Statistician* (2017).](https://peerj.com/preprints/3192/)
]
.pull-right[
```{r, out.width="65%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/mar_ucompd.png")
```
]
???
Vraiment lire l'article de Marwick 2017.
Le package R est l'exemple typique de code reproductible et distribuable.
A gauche on a l'exemple minimal d'un compendium et à droite la structure la
plus complete. Cela dépend de quelques fichiers clés que je vais détailler,
mais on peut y rajouter des dossiers comme data, raw_data, test etc.
Organiser nos projets comme des packages permet d'utiliser des outils
de développement et d'avoir accès à des outils reproductibles (test, doc etc.)
---
.pull-left[
- **`README`** : entrée classique de documentation.
- Aide à l'installation et l'utilisation
- Pour ajouter à un projet : `usethis::use_readme_md()`
```{r, out.width="90%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/readme.png")
```
]
???
Générallement le premier fichier à lire quand on ouvre un projet.
Format de présenter du code et du texte pour montrer des exemples.
--
.pull-right[
- **`LICENCE`** : sans licence, un code est théoriquement inutilisable. <br/>(**MIT**, **GNU GPL**, **CC**)
Dicte les droits d'utilisation, de copie, de modification d'un code.
[Loi Numérique n°2016-1321](https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000033205142/2020-09-21/) impose une licence libre pour tout logiciel produit avec des fonds publics.
```{r, out.width="70%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/licence.png")
```
A nuancer avec les questions de publications, de tutelles etc.
]
???
Faire le lien avec la notice Licence écrite pour IAM.
Prendre le temps de lire la Licence CeCILL en Fr peut être bénéfique
pour comprendre les enjeux et s'ouvrir à l'open source.
---
## Projet = Package 📦
.pull-left[
- **`DESCRIPTION`** :
```
Package: todormd
Type: Package
Title: Using todonotes in rmarkdown package
Version: 0.1.0
Authors@R: c(
person('Maxime', 'Jaunatre',
email = "[email protected]",
role = c('aut', 'cre'))
)
Description: Personnal project number x
License: CeCILL-2
Encoding: UTF-8
Imports:
knitr,
rmarkdown
RoxygenNote: 7.1.1
Suggests:
testthat (>= 3.0.0)
```
???
Diapo davantage tournée vers la structure de package.
DESCRIPTION est un fichier pensé pour être lue par l'ordi également
ajoute la notion des dépendances d'un package.
--
]
.pull-right[
- **`NEWS.md`** : Fichier de suivis des mises à jour d'un projet.
Permet d'informer sur un changement majeur ou des nouveautés. Important d'avoir un cycle de version avec :<br/> `0.1.1` > `0.1.0`
[Why and how maintain a NEWS file for your R package?](https://blog.r-hub.io/2020/05/08/pkg-news/)
- Pour ajouter une dépendances au projet : `devtools::use_package("tidyr")`
```{r, out.width="15%", fig.show='hold', align.center = TRUE, fig.cap=" "}
knitr::include_graphics(c(
"CSU_RepRo_files/figure-html/devtools.png"))
```
]
???
NEWS permet d'informer l'utilisateurs des changements entre différentes versions
d'un projet. Bien tenu à jour, il complète git.
---
## Documentation ℹ
.pull-left[
- Rédiger en amont (`{Roxygen2}`)
```{r, echo = TRUE}
#' half_life
#'
#' compute half_life percentage.
#'
#' @param period period in minute
#' @param time time elapsed (min)
#'
#' @return percentage.
#' @author M. Jaunatre <mail>
#'
#' @examples
#' half_life(20, 20)
#' half_life(20, 40)
#'
half_life <- function(period, time){
return((1 - 2^(-time/period)) * 100)
}
```
]
???
Il vaut mieux documenter en amont comme cela on réfléchis à ce que l'on code.
Permet de clairement identifier ce que l'on prend en entrée et ce que l'on
retourne.
Permet également d'écrire quelques exemple.
--
.pull-right[
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/document-all-the-things.jpg")
```
]
???
La redondance dans la documentation est bénéfique !
---
## Documentation ℹ
.pull-left[
**Forme longue de documentation**
- `{Rmarkdown}` ! Permet de mélanger texte (**md**, $\LaTeX$) et code **R**.
- Vignettes pour les packages
- Rédaction d'articles -> `{rticles}`
- Diapos -> `{xaringan}`
- Livre -> `{bookdown}`
- Site web -> `{pkgdown}`
```{r, out.width="15%", fig.show='hold', align.center = TRUE, fig.cap=" "}
knitr::include_graphics(c(
"CSU_RepRo_files/figure-html/rmarkdown.png",
"CSU_RepRo_files/figure-html/knitr.png",
"CSU_RepRo_files/figure-html/rticles.png",
"CSU_RepRo_files/figure-html/xaringan.png",
"CSU_RepRo_files/figure-html/bookdown.png",
"CSU_RepRo_files/figure-html/pkgdown.png"))
```
]
.pull-right[
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/markdown.png")
```
]
???
Rmarkdown permet de tout lier et de ne fournir qu'un seul document contentant
l'analyse et la rédaction. Permet de s'assurer que tout tourne,
exemple des scripts stochastiques !
moins de fichiers annexe comme les png et jpeg etc. Juste un fichier et des données
Diapo faites avec Xaringan
rticles est très efficaces pour produire des pdfs au format de soumissions.
Intéressant car cela supprime l'export de figures et assure qu'elles sont
toujours à jour.
---
## Lisibilité
.pull-left[
```{r, echo = TRUE, eval = FALSE}
# Title ####
# Author, date, contact (?) etc
# Description
## Depends ####
library(matreex)
# remotes::install_github(
# "github.com/gowachin/todormd"
# )
# sources
sources("R/hello_world.R")
# functions
foo <- function(){cat("Don't panic !")}
## Datasets ####
read.csv(file = "raw_data/P_abies.csv")
## Edit Dataset ####
## Plots ####
## Export ####
```
]
???
Organisation d'un script présenté ainsi permet au lecteur de
s'assurer qu'il peut le reproduire
par exemple les librairies au début facilite la vie au lecteur,
il ne faut plus chercher les dépendances
functions au début permet d'utiliser le principe DRY
--
.pull-right[
- **DRY** (Don't Repeat Yourself)
- **KISS** (Keep it Simple, Stupid) <br> plein de petits fichiers > script infini
- `{cleanR}`: nettoyer les lignes inutiles.
- `{styleR}`: reformate le code.
```{r, out.width="100%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/unreadible.png")
```
]
???
si beaucoup de fonctions apparaissent -> faire un script externe
si beaucoup de librairie apparaisent -> KISS et nouveau script.
---
## Lisibilité
.pull-left[
```{r, echo = TRUE, eval = FALSE}
# Bad #
if(`T`){print(10)}
`T` <- FALSE
`mean` <- function(x) sum(x)
if (y < 0 && debug)
* message("y is negative")
* stop("error for in y test")
*function_with_many_argument("that", many)
function_with_many_argument(x = "that",
* many)
x` = `5
i = 0` ; y=12`
```
]
.pull-right[
```{r, echo = TRUE, eval = FALSE}
# Nice #
if(TRUE){print(10)} # Full logical
testing <- FALSE # name conflict
use_sum <- function(x) sum(x)
if (y < 0 && debug) {
message("y is negative")
stop("error for in y test")
} # Braces
function_with_many_argument(
x = "that",
y = many # name args
) # line limit = 80
x <- 5 # arrow
i <- 0
y <-12
```
]
"**Code needs a lot of whitspace. That is how it breathes.**" Roger Peng
???
Toujours mettres les valeurs logiques en entier.
Attention a ne pas renommer des fonctions qui existent déjà, R est trop gentils.
Pas d'obligation d'indentation ou d'acollades, mais simplifie la lecture.
Pas de limites de lignes mais autant se limiter à 80 charactères (origine des cartes perforées IBM)
Les retours à la lignes après les virgules sont très lisibles.
Nommer les arguments des fonctions maisons permet aussi de faciliter la lecture.
Attribuer variable à une valeur est plus lisible avec "<-", "=" étant reservé pour les appels de fonction.
Préferer une attribution de variable par ligne.
---
layout: true
# Interopérable 📎
---
**Un projet ne doit pas dépendre de l'ordinateur qu'il utilise** -> Portabilité
Cela signifie l'oublis de ces commandes maudites :
```{r, echo=TRUE, eval = FALSE}
*setwd("C:/home/maxime/Documents/Projet magnifique/mouette/analyse/bob/modèle/Tset/")
```
```{r, echo=TRUE, eval=FALSE}
rm(list = ls()) # -> Supprime uniquement les objects "utilisateurs"
# -> Ne supprime pas des dépendances chargées.
# -> Indique une sesssion R ouverte depuis 30 ans
# -> Vide l'environnement des copains qui veulent aider
# -> Fait aussi disparaitre les bébés phoques
```
--
Si votre script possède ces lignes, **Jenny Bryan viendra bruler** votre ordinateur. 🔥
Solution ? Utiliser les **Projets Rstudio** ou `{here}`
.footnote[
*A noter l'espace, et l'accent dans ce chemin !*
]
???
Non vraiment il ne faut pas s'en servir...
Liens vers le blog de Jenny Bryan à la fin du diapo
Je n'ai pas testé le package {here} mais il semble une bonne alternative pour
ceux qui n'utilisent pas Rstudio.
---
`File -> New Project -> New Directory`
```{r, out.width="70%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/new_project.png")
```
???
Comment créer un projet
---
Dans un project, tout les chemins sont basés sur la racine du projet (où ce situe `.Rproj`)
```{r, out.width="70%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/my_awesome_project.png")
```
Désactiver la sauvegarde automatique !
`Tools -> Global options -> General -> un-tick "always save history"`
???
Désactiver la sauvegarde automatique permet d'assurer la reproducibilité car
chaque session devient indépendante et doit donc être reproductible.
---
layout: true
# Reusable 🔃
---
## Données
Un script ne doit dépendre que des données présentes dans son projet.
.pull-left[
**raw_data/ = données intouchables**
]
.pull-right[
**data/ = données temporaires**
]
--
- Eviter les `.RData` ! Indice de données trop complexes et de script pas clair.
Seule exception : les données de type cache : faire tourner les scripts plus facilement.
Package `{targets}` pour refaire tourner que les parties modifiées ou dépendantes d'un script.
```{r, out.width="60%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/drake.png")
```
???
On doit pouvoir supprimer les .RData et le dossier data car ce sont des données
temporaires et donc reproductibles.
Le mieux étant de privilégier l'export vers des données de type CSV, excell, etc.
Il faut penser à la reproductibilité même en dehors de R, et laisser la possibilité
d'utiliser d'autres outils que R comme python ou excell.
---
Parfois les données sont complexes et **non distribuables**.
- **ReprEx** : Avoir un **exemple** reproductible simplifié pour chaque script.
--
Exemple : ici la fonction prend un object en entrée...mais quel format doit-il avoir ?
.pull-left[
```{r, echo = TRUE}
rm_dups <- function(data){
data <- data[! duplicated(data$x), ]
data
}
```
]
???
Cette fonction marche sur mon ordi mais je ne peux pas prouver cela sur un ordi
externe car le jeu de donnée est sensible.
--
.pull-right[
```{r, echo = TRUE}
df <- data.frame(x = c(0,1,1,0),
y = c(2,1,0,0))
rm_dups(df)
```
]
???
Un exemple reproductible permet de démontrer que cela marche.
--
Fournir un exemple est un très bon début de documentation.
Exemple = niveau 0 du test !
---
## Test !
Nous testons tous nos codes à la main, et ça marche sur le coup...mais 2 semaines après ?
.pull-left[
- Ecrire des tests unitaires qui font tourner le code tout seul. <br/> -> Dossier `test/`
- `usethis::use_testthat()` charge automatiquement `{testthat}`
```{r, out.width="20%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/testthat_logo.png")
```
]
.pull-right[
```{r, out.width="70%"}
knitr::include_graphics("CSU_RepRo_files/figure-html/test_doc.jpg")
```
]
**Il vaut mieux prévenir que guérir !**
???
Vérifier manuellement que le code marche est une première chose,
mais on risque d'oublier ce que l'on fait à la main après 6 mois.
Un test écrit n'oublis pas ce qu'il faut tester.
---
## Test !
.pull-left[
Utiliser `{usethis}` pour simplifier la vie !
```{r, echo = TRUE}
library(testthat)
add <- function(y,x){
x+y
}
```
- `usethis::use_test("add")`
```{r, echo = TRUE, eval = FALSE}
tests
├── testthat
│ └── test-add.R
└── testthat.R
```
]
???
usethis crée directement le fichier test au bon endroit et
me l'ouvre pour l'éditer.
--
.pull-right[
```{r, echo = FALSE}
Sys.setenv("LANGUAGE" = "EN")
# Evite que le message d'erreur passe en français.
```
```{r, echo = TRUE}
test_that("add works", {
expect_equal(add(39, 3), 42)
})
test_that("add str error", {
err = paste("non-numeric argument",
"to binary operator")
expect_error(
add("hello", "world"), err
)
})
```
]
???
Deux tests, un pour vérifier qu'il marche et un autre pour vérifier qu'il
donne les bonnes erreurs.