---
title: "Developing an R package"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Developing an R package}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
```
**PLEASE READ THE
[GET STARTED](https://frbcesab.github.io/rcompendium/articles/rcompendium.html) VIGNETTE FIRST**
## Package content
First, create a **new empty RStudio project**. Let's called it `pkg`.
To create a new package structure, run `rcompendium::new_package()`.
By default, the following content is created:
```
pkg/ # Root of the package
│
├── pkg.Rproj # RStudio project (created by user, optional)
│
├── .git/ # GIT tracking folder
├── .gitignore # List of files/folders to be ignored by GIT
| # (specific to R language)
|
├── .github/ # (optional) GitHub Actions settings
│ └── workflows/
│ ├── pkgdown.yaml # Configuration file to build & deploy website
│ ├── R-CMD-check.yaml # Configuration file to check & test package
│ ├── render-README.yaml # Configuration file to render the README.md
│ └── test-coverage.yaml # Configuration file to report code coverage
│
├── _pkgdown.yaml # (optional) User website settings
│
├── R/ # R functions location
│ ├── fun-demo.R # Example of an R function (to remove)
│ └── pkg-package.R # Dummy R file for package-level documentation
│
├── man/ # R functions helps (automatically updated)
│ ├── print_msg.Rd # Documentation of the demo R function
│ ├── pkg-package.Rd # Package-level documentation
│ └── figures/ # Figures for the README
│ └── package-sticker.png # Package sticker template
│
├── tests/ # (optional) Units tests location
│ ├── testthat.R # Units tests settings
│ └── testthat/ # Units tests location
│ └── test-demo.R # Units tests for the demo function (to remove)
|
├── vignettes/ # (optional) Vignettes location
│ └── pkg.Rmd # Get started tutorial [*]
│
├── DESCRIPTION # Project metadata [*]
├── LICENSE.md # Content of the GPL (>= 2) license (default)
├── NAMESPACE # Automatically generated
├── .Rbuildignore # List of files/folders to be ignored while
│ # checking/installing the package
├── inst/
│ ├── CITATION # BiBTeX entry to cite the package [*]
│ └── package-sticker/
│ ├── package-sticker.R # Code to generate package sticker
│ └── r_logo.png # R logo
│
├── README.md # GitHub README (automatically generated)
└── README.Rmd # GitHub README [*]
[*] These files are automatically created but user needs to manually add
some information.
```
In addition, a new GitHub repository will be created directly from R. It will be
available at: `https://github.com/{{account}}/pkg/` (where `{{account}}` is either
your GitHub account or a GitHub organization). A few minutes later, the website
([`pkgdown`](https://pkgdown.r-lib.org/)) will be deployed at:
`https://{{account}}.github.io/pkg/`.
## Package metadata
### DESCRIPTION
The `DESCRIPTION` file contains important package metadata. By default, `rcompendium`
creates the following file:
```
Package: pkg
Type: Package
Title: The Title of the Project [*]
Version: 0.0.0.9000
Authors@R: c(
person(given = "John",
family = "Doe",
role = c("aut", "cre", "cph"),
email = "john.doe@domain.com",
comment = c(ORCID = "9999-9999-9999-9999")))
Description: A paragraph providing a full description of the project (on [*]
several lines...)
URL: https://github.com/jdoe/pkg
BugReports: https://github.com/jdoe/pkg/issues
License: GPL (>= 2)
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.1.2
VignetteBuilder: knitr
Suggests:
knitr,
rmarkdown,
testthat (>= 3.0.0)
Config/testthat/edition: 3
[*] Title and Description must be adapted by user.
```
For further information, please read [https://r-pkgs.org/description.html](https://r-pkgs.org/description.html).
**N.B.** If you change `Title`, `Description`, `Version`, and `Authors@R` values, do not forget to
also change citation information in `inst/CITATION` and `README.Rmd`.
### README
The `README.md` is the homepage of your repository on GitHub. Its purpose is to
help visitor to understand your project. Always edit the `README.Rmd` (not the
`.md` version).
For further information, please read
[https://r-pkgs.org/release.html#readme](https://r-pkgs.org/release.html#readme).
## Recommended workflow
The recommended workflow is:
1. Implement new function in `R/`
2. Document function using the [roxygen syntax](https://roxygen2.r-lib.org/articles/roxygen2.html)
3. Update functions doc (`man/`) and `NAMESPACE` with `devtools::document()`
4. Update list of required packages in `DESCRIPTION` with `rcompendium::add_dependencies()`
5. Implement units tests using [`testthat`](https://testthat.r-lib.org/)
6. Edit vignette to illustrate the new feature
7. Check and test the package with `devtools::check()`
You can also provide data with your package. See `?usethis::use_data`.
We strongly recommend that you read the book [R packages](https://r-pkgs.org/) by
Hadley Wickham and Jenny Bryan.
## Resources
- [R packages](https://r-pkgs.org/) by Hadley Wickham and Jenny Bryan
- [Writing R extensions](https://cran.r-project.org/doc/manuals/r-release/R-exts.html) by
the R Development Core Team
- [Extending R](https://www.taylorfrancis.com/books/mono/10.1201/9781315381305/extending-john-chambers) by
John M. Chambers