Commit f0964dd6 authored by Dorchies David's avatar Dorchies David
Browse files

docs(bookdown): corrections proposed by @guillaume.thirel

- add references to biblio

Refs #3
parent e8416966
Pipeline #31799 failed with stages
in 36 minutes and 1 second
......@@ -25,7 +25,8 @@ Suggests:
rgeos,
testthat (>= 3.0.0),
tidyr,
mapsf
mapsf,
tidyquant
VignetteBuilder: knitr
Depends:
R (>= 2.10),
......
......@@ -24,3 +24,5 @@ default:
cloud: false
path: C:/Chemin/vers/mon/dossier/de/donnees/local
```
##
# Calage du modèle {#calage}
```{r setup, echo=FALSE}
library(airGR)
```{r setup, echo=FALSE, E, results='hide'}
library(seinebasin2)
cfg <- loadConfig()
```
Les fonctions du package 'seinebasin2' permettent de simplifier au maximum les opérations de calage quine nécessitent que deux étapes : le chargement des données et le lancement du calage.
Le calage du modèle hydrologique semi-distribué utilise en entrée les précipitations, températures et évapotranspiration extraites de la base SAFRAN [@vidal50yearHighresolutionAtmospheric2010] et aggrégée à l'échelle des sous-bassins versants intermédiaires définis par @nuneztorresSimulationBassinVersant2021.
Les débits observés utilisés pour le calage proviennent de la banque hydro [@leleuRefoundingNationalInformation2014] et de données fournies par l'EPTB Seine Grands Lacs. Les débits observés aux prises et restitutions des réservoirs ont été fournies par l'EPTB Seine Grands Lacs.
Les fonctions du package 'seinebasin2' permettent de simplifier au maximum les opérations de calage qui ne nécessitent que deux étapes : le chargement des données et le lancement du calage.
## Calage des stations du bassin sans prise en compte des réservoirs
La fonction suivante se charge de lire la structure du modèle, des données météorologiques SAFRAN aggrégées à l'échelle des sous-bassins et des données de débits issus de la banque hydro et de stocker cela dans une liste.
```{r}
cfg <- loadConfig()
BasinsObs <- loadBasinsObs("BasinsObs_observations_day_1958-2019.RDS", cfg = cfg)
```
......@@ -29,15 +32,16 @@ OC <-
)
```
## Calage des stations du bassin avec prise en compte des réservoirs {#calage_avec_reservoirs}
## Calage des stations du bassin avec prise en compte des réservoirs {#calage-avec-reservoirs}
Pour caler le modèle avec l'influence des réservoirs, on ajoute les prises et les restitutions des réservoirs à la structure du modèle ainsi que les débits observés à ces prises et restitutions. La "prise d'eau" du lac de Pannecière est calculée en fonction de l'apport naturel arrivant dans le lac.
Pour caler le modèle avec l'influence des réservoirs, on ajoute les prises et les restitutions des réservoirs à la structure du modèle ainsi que les débits observés à ces prises et restitutions.
La "prise d'eau" du lac de Pannecière est calculée en fonction de l'apport naturel arrivant dans le lac. Pour cela, on effectue un calage et un simulation des débits à l'amont du lac de Pannecière à l'aide de la fonction `addReservoirsQ`.
```{r}
BasinsObs_with <- BasinsObs
BasinsObs_with$griwrm <- addReservoirsGRiwrm(BasinsObs_with$griwrm)
BasinsObs_with$Q <- addReservoirsQ(BasinsObs_with)
plot(BasinsObs_with$griwrm)
```
L'opération de calage peut ensuite avoir lieu avec prise en compte de ces influences.
......@@ -50,7 +54,7 @@ OC <-
)
```
## Comparaison des calages avec et sans prise en compte des réservoirs
## Comparaison des débits simulés avec et sans prise en compte des réservoirs
Il faut lancer la simulation des deux modèles pour les sortir cote à cote. La fonction `seinebasin2::RunModel` ne nécessite qu'on lui fournisse les données d'entrée et le paramétrage du modèle pour fournir les chroniques de débits simulés.
......@@ -62,10 +66,13 @@ OM_with <- RunModel(BasinsObs_with, "calibration_with_reservoirs.txt")
Nous affichons ci-dessous les graphiques de chroniques de débits et les régimes pour les deux calages sur la station "H1231010 - L'Aube à Blaincourt-sur-Aube" située à l'aval de la restitution du lac Aube (Ces graphiques ont servi à produire la Figure 10 du rapport [Réf à fournir]).
```{r, warning=FALSE, fig.cap="Chronique des débits simulés et observés sans et avec intégration de l'influence des lacs-réservoirs pour la station H1231010 - L'Aube à Blaincourt-sur-Aube"}
```{r, warning=FALSE, fig.cap="Chronique des débits simulés et observés sans intégration de l'influence des lacs-réservoirs pour la station H1231010 - L'Aube à Blaincourt-sur-Aube"}
station <- "H1231010"
IndPeriod_Run <- seq(366, length(BasinsObs$DatesR))
plot(OM_without[[station]], Qobs = BasinsObs$Q[IndPeriod_Run, station] , which = "Flows")
```
```{r, warning=FALSE, fig.cap="Chronique des débits simulés et observés avec intégration de l'influence des lacs-réservoirs pour la station H1231010 - L'Aube à Blaincourt-sur-Aube"}
plot(OM_with[[station]], Qobs = BasinsObs$Q[IndPeriod_Run, station] , which = "Flows")
```
......@@ -77,6 +84,8 @@ plot(OM_with[[station]], Qobs = BasinsObs$Q[IndPeriod_Run, station], which = "Re
## Evaluation des performances du modèle
Les indicateurs utilisés pour l'évaluation sont ceux utilisés lors du projet Explore 2070 [@chazotExplore2070Lot2012].
```{r}
getMapRatio <- function(Qsim, Qobs, FUN, varTitle) {
pSim <- FUN(Qsim)
......@@ -162,7 +171,7 @@ Qsim[is.na(Qobs)] <- NA
getMapRatio(Qsim, Qobs, calcQA, "R-QA")
```
## VCN30 de période de retour 2 ans
### VCN30 de période de retour 2 ans
```{r, fig.cap="Carte des R-VCN30-2 des Bassins versants intermédiaires"}
calcVCN30Y2 <- function(x) {
......@@ -171,7 +180,7 @@ calcVCN30Y2 <- function(x) {
getMapRatio(Qsim, Qobs, calcVCN30Y2, "R-VCN30-2")
```
## QMNA5&nbsp;: Débit moyen mensuel minimum annuel de période de retour 5 ans
### QMNA5&nbsp;: Débit moyen mensuel minimum annuel de période de retour 5 ans
```{r, fig.cap="Carte des R-QMNA5 des Bassins versants intermédiaires"}
calcQMNA5 <- function(x) {
......@@ -180,7 +189,7 @@ calcQMNA5 <- function(x) {
getMapRatio(Qsim, Qobs, calcQMNA5, "R-QMNA5")
```
## QJXA10&nbsp;: Débit moyen journalier maximum annuel de période de retour 10 ans
### QJXA10&nbsp;: Débit moyen journalier maximum annuel de période de retour 10 ans
```{r, fig.cap="Carte des R-QMNA5 des Bassins versants intermédiaires"}
calcQJXA10 <- function(x) {
......
# Naturalisation des débits {#naturalisation}
# Débits désinfluencés {#desinfluencement}
```{r setup, echo=FALSE}
```{r setup, echo=FALSEE, results='hide'}
library(seinebasin2)
cfg <- loadConfig()
```
## Naturalisation par simulation {#naturalisation_simulation}
## Désinfluencement par simulation {#desinfluencement-simulation}
La naturalisation des débits par simulation consiste à simuler le bassin versant avec les paramètres calés pour le modèle prenant en compte les influences humaines (Voir Section \@ref(calage_avec_reservoirs)) tout en supprimant toutes les influences humaines du modèle.
Parmi les méthodes disponibles de désinfluencement des débits [@terrierStreamflowNaturalizationMethods2020], nous avons choisi la méthode par simulation.
La désinfluencement des débits par simulation consiste à simuler le bassin versant avec les paramètres calés pour le modèle prenant en compte les influences humaines (Voir Section \@ref(calage-avec-reservoirs)) tout en supprimant toutes les influences humaines du modèle.
Nous chargeons donc la structure du modèle sans les réservoirs et les données climatiques :
......@@ -22,14 +24,12 @@ InputsModel <- CreateInputsModel(BasinsObs)
OutputsModel <- RunModel(BasinsObs, "calibration_with_reservoirs.txt", InputsModel = InputsModel)
```
```{r, warning=FALSE, fig.cap="Régimes des débits naturalisés et observés pour la station H1231010 - L'Aube à Blaincourt-sur-Aube"}
```{r, warning=FALSE, fig.cap="Régimes des débits désinfluencés et observés pour la station H1231010 - L'Aube à Blaincourt-sur-Aube"}
station <- "H1231010"
IndPeriod_Run <- seq(366, length(BasinsObs$DatesR))
plot(OutputsModel[[station]], Qobs = BasinsObs$Q[IndPeriod_Run, station], which = "Regime")
```
Les débits en m<sup>3</sup>/s sont enregistrés pour archivage avec la fonction suivante :
```{r, eval=!cfg$data$cloud}
......@@ -45,7 +45,7 @@ Les fichiers au format [Tab-separated values (TSV)](https://fr.wikipedia.org/wik
### Données Hydratec
Chargement des chroniques&nbsp;:
Chargement des chroniques [@hydratecActualisationBaseDonnees2011a]&nbsp;:
```{r}
hydratec <- loadHydratecDB(cfg = cfg)
......
# Les scénarios climatiques DRIAS 2020 {#drias2020}
```{r setup, echo=FALSE}
```{r setup, echo=FALSE, results='hide'}
library(seinebasin2)
library(sp)
library(dplyr)
......@@ -9,7 +9,7 @@ cfg <- loadConfig()
## Format des données
Les chroniques de scénarios climatiques proviennent de données extraites du portail du DRIAS (http://www.drias-climat.fr). Les données, au pas de temps journalier, sont projetées sur une grille de 8 km de résolution qui couvrent tout le territoire métropolitain.
Les chroniques de scénarios climatiques font partie du jeu de données climatiques DRIAS 2020 débiaisées avec la méthode ADAMONT [@verfaillieMethodADAMONTV12017]. Les données, au pas de temps journalier, sont projetées, à l'instar de la base SAFRAN [@vidal50yearHighresolutionAtmospheric2010] sur une grille de 8 km de résolution qui couvrent tout le territoire métropolitain.
Nous avons effectué une sélection des mailles couvrant le bassin versant de la Seine avec l'exutoire à Vernon.
......@@ -66,7 +66,7 @@ str(dfMailles[dfMailles$CODE == "H5920010",])
## Calcul des données météorologiques moyennées sur les BVI
### Liste des scénarios DRIAS à traiter
### Liste des scénarios DRIAS 2020 à traiter
```{r}
drias_data_files <- listDataFiles(file.path(cfg$hydroclim$path, "drias"), cfg = cfg)
......@@ -75,7 +75,7 @@ scenarioDriasFiles <- sapply(cfg$hydroclim$drias$scenarios, getDrias2020filename
La liste des scénarios sélectionnés pour l'étude est la suivante : `r paste(cfg$hydroclim$drias$scenarios, collapse = ", ")`. Pour chaque scenario, les données sont présentes pour une période de référence (1950-2005) et une projection RCP4.5 (2006-2100).
### Aggrégation des données DRIAS
### Aggrégation des données DRIAS 2020
```{r, eval=!cfg$data$cloud}
driasPath <- getDataPath(cfg$hydroclim$path)
......
# Modélisations des débits naturalisés sous forçage climatique {#QnatDrias2020}
# Modélisations des débits naturels sous forçage climatique {#QnatDrias2020}
## Simulation et enregistrement des chroniques de débits naturalisés
Dans ce chapitre, nous simulerons les débits naturels (c.-à-d. sans prise en compte des influences) à partir des projections climatiques DRIAS 2020 mises en forme à la section \@ref(drias2020).
```{r setup, echo=FALSE}
## Simulation et enregistrement des chroniques de débits naturels
```{r setup, echo=FALSE, results='hide'}
library(seinebasin2)
cfg <- loadConfig()
```
L'exécution des simulations avec les scénarios DRIAS entre 1950 (ou 1951) et 2100 et l'enregistrement des résultats au format définis à la section \@ref(naturalisation_simulation) s'effectue avec la fonction suivante qui regroupe toutes les opérations à effectuer pour lancer et sauvegarder la simulation d'un scénario climatique&nbsp;:
L'exécution des simulations avec les projections DRIAS 2020 entre 1950 (ou 1951) et 2100 et l'enregistrement des résultats au format définis à la section \@ref(desinfluencement-simulation) s'effectue avec la fonction suivante qui regroupe toutes les opérations à effectuer pour lancer et sauvegarder la simulation d'un scénario climatique&nbsp;:
```{r}
LoadRunSave <- function(rcp, scenario) {
......@@ -37,15 +39,15 @@ scenarios <- rep(scenarios, length(rcps))
mapply(LoadRunSave, rcp = rcps, scenario = scenarios)
```
Les données de débit naturalisées simulées avec les forçages climatiques du DRIAS 2020 créées par le script ci-dessus sont téléchargeables à l'adresse :
Les données de débits naturels simulés avec les forçages climatiques du DRIAS 2020 créées par le script ci-dessus sont téléchargeables à l'adresse :
https://owncloud.dorch.fr/index.php/s/pCPZvY4lk6xGC8m?path=%2F03-naturalised_flows%2FDrias2020%2FQnat-v1
## Comparaison des débits naturalisés sous forçage climatique avec les données historiques
## Comparaison des débits naturels sous forçage climatique avec les données historiques
### Chargement des bases de données de débit
#### Débits naturalisés Hydratec
#### Débits naturels Hydratec
```{r}
hydratec <- loadHydratecDB(cfg = cfg)
......@@ -58,7 +60,7 @@ Qnat <- readQsim(cfg$Qnat$path, "Qnat-v1", cfg = cfg)
Qnat <- Qnat[, names(hydratec$Q)]
```
#### Débits simulés sur les scénarios climatiques DRIAS 2020
#### Débits simulés sur le climat passé et futur avec les projections climatiques DRIAS 2020
```{r}
loadDriasQsim <- function(rcp_scenario) {
......@@ -70,7 +72,6 @@ QsimDrias <- lapply(paste(rcps, scenarios, sep="/"), loadDriasQsim)
names(QsimDrias) <- paste(rcps, scenarios, sep = " - ")
```
### Calcul du VCN10 et comparaison
Calcul des VCN10 pour toutes les sources de données entre 1959 et 2019&nbsp;:
......@@ -103,16 +104,18 @@ Tracé des VCN10 pour la station hydro `r hydratec$stations$nom[hydratec$station
```{r}
library(ggplot2)
library(tidyquant)
plotVCN <- function(CdSiteHydro, df) {
df <- df[df$CdSiteHydro == CdSiteHydro, ]
ggplot(df, aes(x = DatesR, y = Q)) +
geom_point(aes(color = source, shape = source, size = source)) +
scale_shape_manual(values=c(16, 16, rep(1,length(scenarios)))) +
scale_size_manual(values=c(3, 3, rep(1,length(scenarios)))) +
ggtitle("VCN10 annuel des débits naturalisés",
scale_size_manual(values=c(1, 1, rep(0.5,length(scenarios)))) +
geom_ma(aes(colour = source), n = 5, size = 1, linetype = "solid") +
ggtitle("VCN10 annuel et moyenne mobile sur 5 ans des débits naturels",
paste0(hydratec$stations$nom[hydratec$stations$CdSiteHydro == CdSiteHydro],
" (", CdSiteHydro, ")")) +
xlab("Année") + ylab(bquote('Débit naturalisé'~(m^3/s))) +
xlab("Année") + ylab(bquote('Débit naturel'~(m^3/s))) +
labs(color = "Source", shape = "Source", size = "Source")
}
plotVCN("H5920010", dfVCN10)
......@@ -126,8 +129,8 @@ apply(hydratec$stations, 1, function(station) {
p <- plotVCN(CdSiteHydro, dfVCN10)
path <- getDataPath(cfg$Qnat$path, "Analyses/Drias2020/Qnat-v1")
filename <- paste0(
paste("VCN10",
CdSiteHydro,
paste("VCN10",
CdSiteHydro,
iconv(gsub(" |:|\\.|'", "_", station["nom"]), from = "UTF-8", to = "ASCII//TRANSLIT"),
sep = "_"),
".png" )
......
# Evolution des indicateurs hydrologiques
```{r setup, echo=FALSE}
```{r setup, echo=FALSE, results='hide'}
library(seinebasin2)
cfg <- loadConfig()
```
......
......@@ -33,6 +33,24 @@
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\8SQ9UWXM\\Lang Delus - 2011 - Les étiages définitions hydrologique, statistiqu.pdf}
}
@article{leleuRefoundingNationalInformation2014,
title = {Re-Founding the National Information System Designed to Manage and Give Access to Hydrometric Data},
author = {Leleu, Isabelle and Tonnelier, Isabelle and Puechberty, Rachel and Gouin, Philippe and Viquendi, Isabelle and Cobos, Laurent and Foray, Anouck and Baillon, Martine and Ndima, Pierre-Olivier},
date = {2014-02-01},
journaltitle = {La Houille Blanche},
volume = {100},
number = {1},
pages = {25--32},
publisher = {{Taylor \& Francis}},
issn = {0018-6368},
doi = {10.1051/lhb/2014004},
url = {https://doi.org/10.1051/lhb/2014004},
urldate = {2021-05-31},
keywords = {banque Hydro,base de données,data base,eau,hydrologie,hydrology,hydrométrie,hydrometry,information system,système d'information,water},
annotation = {\_eprint: https://doi.org/10.1051/lhb/2014004},
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\M5PLGR49\\Leleu et al. - 2014 - Re-founding the national information system design.pdf;C\:\\Users\\david.dorchies\\Zotero\\storage\\SWI2NVWP\\2014004.html}
}
@thesis{nuneztorresSimulationBassinVersant2021,
type = {other},
title = {Simulation d'un bassin versant anthropisé à l'aide d'un modèle hydrologique semi-distribué : Le bassin de la Seine et ses réservoirs Rapport de stage ST5 -Polytech Sorbonne -1er septembre 2021},
......@@ -67,6 +85,24 @@
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\9ENK4C92\\Oudin et al. - 2005 - Which potential evapotranspiration input for a lum.pdf}
}
@article{terrierStreamflowNaturalizationMethods2020,
title = {Streamflow Naturalization Methods: A Review},
shorttitle = {Streamflow Naturalization Methods},
author = {Terrier, Morgane and Perrin, Charles and de Lavenne, Alban and Andréassian, Vazken and Lerat, Julien and Vaze, Jai},
options = {useprefix=true},
date = {2020-11-26},
journaltitle = {Hydrological Sciences Journal},
shortjournal = {Hydrological Sciences Journal},
pages = {1--25},
issn = {0262-6667, 2150-3435},
doi = {10.1080/02626667.2020.1839080},
url = {https://www.tandfonline.com/doi/full/10.1080/02626667.2020.1839080},
urldate = {2021-01-06},
abstract = {Over the past few decades, several naturalization methods have been developed for removing anthropogenic influences from streamflow time series, to the point that naturalized flows are often considered true natural flows in many studies. However, such trust in a particular naturalization method does not expose the assumptions underlying the method, nor does it quantifies the associated uncertainty. This review provides an overview of streamflow naturalization approaches. The terminology associated with naturalization is discussed, and a classification of naturalization methods according to their data requirements and main assumptions is proposed. A large set of studies developing or applying naturalization methods are reviewed, and the main challenges associated with the methods applied are assessed. To give a more concrete example, a focus is made on studies conducted in France over the last decade, which applied naturalization methods to estimate water extraction limits in rivers.},
langid = {english},
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\6KKQ9H7A\\Terrier et al. - 2020 - Streamflow naturalization methods a review.pdf}
}
@article{verfaillieMethodADAMONTV12017,
title = {The Method {{ADAMONT}} v1.0 for Statistical Adjustment of Climate Projections Applicable to Energy Balance Land Surface Models},
author = {Verfaillie, Deborah and Déqué, Michel and Morin, Samuel and Lafaysse, Matthieu},
......@@ -85,4 +121,23 @@
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\632RTVSW\\Verfaillie et al. - 2017 - The method ADAMONT v1.0 for statistical adjustment.pdf;C\:\\Users\\david.dorchies\\Zotero\\storage\\ISRZINHK\\2017.html}
}
@article{vidal50yearHighresolutionAtmospheric2010,
title = {A 50-Year High-Resolution Atmospheric Reanalysis over {{France}} with the {{Safran}} System},
author = {Vidal, Jean-Philippe and Martin, Eric and Franchistéguy, Laurent and Baillon, Martine and Soubeyroux, Jean-Michel},
date = {2010},
journaltitle = {International Journal of Climatology},
volume = {30},
number = {11},
pages = {1627--1644},
issn = {1097-0088},
doi = {10.1002/joc.2003},
url = {https://rmets.onlinelibrary.wiley.com/doi/abs/10.1002/joc.2003},
urldate = {2021-05-20},
abstract = {The assessment of regional climate change requires the development of reference long-term retrospective meteorological datasets. This article presents an 8-km-resolution atmospheric reanalysis over France performed with the the Safran-gauge-based analysis system for the period 1958–2008. Climatological features of the Safran 50-year analysis—long-term mean values, inter-annual and seasonal variability—are first presented for all computed variables: rainfall, snowfall, mean air temperature, specific humidity, wind speed and solar and infrared radiation. The spatial patterns of precipitation, minimum and maximum temperature are compared with another spatialization method, and the temporal consistency of the reanalysis is assessed through various validation experiments with both dependent and independent data. These experiments demonstrate the overall robustness of the Safran reanalysis and the improvement of its quality with time, in connection with the sharp increase in the observation network density that occurred in the 1990s. They also show the differentiated sensitivity of variables to the number of available ground observations, with precipitation and air temperature being the more robust ones. The comparison of trends from the reanalysis with those from homogenized series finally shows that if spatial patterns are globally consistent with both approaches, care must be taken when using literal values from the reanalysis and corresponding statistical significance in climate change detection studies. The Safran 50-year atmospheric reanalysis constitutes a long-term forcing datasets for land surface schemes and thus enables the simulation of the past 50 years of water resources over France. Copyright © 2009 Royal Meteorological Society},
langid = {english},
keywords = {atmospheric reanalysis,climatology,France,high resolution,trends,validation},
annotation = {\_eprint: https://rmets.onlinelibrary.wiley.com/doi/pdf/10.1002/joc.2003},
file = {C\:\\Users\\david.dorchies\\Zotero\\storage\\54M9KGRN\\Vidal et al. - 2010 - A 50-year high-resolution atmospheric reanalysis o.pdf;C\:\\Users\\david.dorchies\\Zotero\\storage\\R88PXXHQ\\joc.html}
}
......@@ -14,14 +14,16 @@ description: ""
Ce rapport contient le code reproductible permettant de modéliser le débit du bassin versant de la Seine.
La modélisation du bassin versant est réalisée à l'aide du package 'seinebasin2' qui fournit en autres des fonctions permettant d'encapsuler la complexité du modèle dans des fonctions simples au noms identiques à celles présentes dans 'airGR' et 'aiGRiwrm'.
La modélisation du bassin versant est réalisée à l'aide du R-package 'seinebasin2' qui fournit en autres des fonctions permettant d'encapsuler la complexité du modèle dans des fonctions simples au noms identiques à celles présentes dans 'airGR' et 'aiGRiwrm'.
La documentation du package est disponible à cette adresse : https://in-wop.g-eau.fr/seinebasin2/package
Le code du package et de ce rapport sont téléchargeables à l'adresse : https://gitlab.irstea.fr/in-wop/seinebasin2
Il est basé sur le travail initial effectué par @nuneztorresSimulationBassinVersant2021.
## A propos de ce rapport
Ce document est un rapport au format {bookdown} généré par le package {InraeThemes}.
Ce document est un rapport au format bookdown [@bookdown2016] généré par le package InraeThemes [@InraeTheme].
......@@ -31,6 +31,13 @@
url = {https://github.com/rstudio/rmarkdown},
}
@Manual{InraeTheme,
title = {Collection non officielle de templates (Rmarkdown) et de thèmes (ggplot) qui respectent la charte graphique INRAE},
author = {David Carayon},
year = {2020},
url = {https://github.com/davidcarayon/InraeThemes},
}
@Book{bookdown2016,
title = {bookdown: Authoring Books and Technical Documents with {R} Markdown},
author = {Yihui Xie},
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment