# Bibliography with knitr : cite your references and packages

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

It’s a good practice to cite the R packages you use in your analysis. However it can be cumbersome to maintain the list of your package’s references in Zotero while the packages used can change in your script. Here we use the automatic updates of Zotero to generate our main bibliography and we auto-generate the package bibliography and then merge them.

### Prerequisites

Install R, Rstudio, Zotero.

Install Better BibTex for Zotero.

To easily add citations in the rmarkdown text in RStudio, we can add the citr package.

### Build the Zotero library

Create a collection for our project.

Export the collection (BibLatex format). Tick the update option.

We save it in our R project folder as zotero.bib. Each time we modify our Zotero collection, the zotero.bib file will be updated. Check in the Zotero settings :

We can also add a personalized CSL file (used to format references) in your R project folder (see the repository). Below I chose ISO-690 (author-date, no abstract, French).

### In our rmarkdown text

In the setup chunk, we load the required packages, generate the .bib file for the packages, merge it with our Zotero bibliography and add the packages as nocite (they are not cited in the text but have to appear in the references).

We must run the setup chunk at least once to generate the files and check which citation to use for the packages that provide multiple references.

We can then carry on our analysis with R chunks and some text with citations.

The citations can be added with [@key] where key is the citation key generated by Better Bibtex and found at the top of the Zotero info panel. Or we can use citr which will help us find it.

---
title: "Bibliography with knitr : cite your references and packages"
author: "r.iresmi.net"
date: "r Sys.Date()"
output: html_document
bibliography: biblio.bib
csl: iso690-author-date-fr-no-abstract.csl
---

{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE) # all your necessary packages packages <- c("tidyverse", "knitr", "bibtex" # add your other packages here ) # install if needed and loading packages to_install <- packages[! packages %in% installed.packages()[, "Package"]] if (length(to_install)) { install.packages(to_install, repos = "https://cloud.r-project.org") } invisible(lapply(packages, library, character.only = TRUE)) # get the packages version packages_versions <- function(p) { paste(packageDescription(p)$Package, packageDescription(p)$Version, sep = " ") } # Get the packages references write.bib(packages, "packages.bib") # merge the zotero references and the packages references cat(paste("% Automatically generated", Sys.time()), "\n% DO NOT EDIT", { readLines("zotero.bib") %>% paste(collapse = "\n") }, { readLines("packages.bib") %>% paste(collapse = "\n") }, file = "biblio.bib", sep = "\n") # Some packages reference keys must be modified # (their key is not the package name) # check in packages.bib packages_keys <- packages %>% enframe() %>% mutate(value = case_when(value == "knitr" ~ "@knitr1", #value == "boot" ~ "@boot1", TRUE ~ paste0("@", value)))  --- nocite: | @Svenssonguideornitho2007 r paste(packages_keys$value, collapse = "\n  ")
---

Any text...

Data analyzed with R [@r_development_core_team_r:_2010][^r_version].

[^r_version]: r version\$version.string, with : r paste(lapply(sort(packages), packages_versions), collapse = ", ").

We can easily cite references (menu Addins / Insert citations) after having run the setup chunk to create the bibliography file [@moreno_measuring_2017].

Lorem Ipsum

## References



After knitting we get the file :

See the result.