openstatsware short course: Good Software Engineering Practice for R Packages
July 17, 2026
install.packages() is used to install packages into the librarylibrary() is used to load and attach packages from the library
search list — objects in the package can be used directlyPackage source = directory with files and subdirectories
Once upon a time, developers would set up this structure manually 🥱
Nowadays, it’s super fast with:
usethis::create_package()DESCRIPTION fileMajor.Minor.Patch syntax (Semantic Versioning)DESCRIPTION file (cont’d)library your packageroxygen2), running examples, tests (testthat), vignettesR folder.R suffix)
usethis::use_r("filename")require(), options() etc.Collate field of DESCRIPTION automatically)NAMESPACE fileNAMESPACE file (cont’d)search() pathman folder.Rd format
LaTeX.Rd files and the NAMESPACE manually 🥱roxygen2! 🚀roxygen2 to the rescue!#' and special macros preceded with @.Rd files and the NAMESPACE file for youusethis::use_roxygen_md()roxygen2 skeleton with Code > Insert Roxygen Skeletonroxygen2 in your projectroxygen2 sourceR/my_sum.R:
#' My Summation Function
#'
#' This is my first function and it sums two numbers.
#'
#' @param x first summand.
#' @param y second summand.
#'
#' @return The sum of `x` and `y`.
#' @export
#'
#' @note This function is a bit boring but that is ok.
#' @seealso [Arithmetic] for an easier way.
#'
#' @examples
#' my_sum(1, 2)
my_sum <- function(x, y) {
x + y
}roxygen2 outputman/my_sum.Rd:
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/my_sum.R
\name{my_sum}
\alias{my_sum}
\title{My Summation Function}
\usage{
my_sum(x, y)
}
\arguments{
\item{x}{first summand.}
\item{y}{second summand.}
}
\value{
The sum of \code{x} and \code{y}.
}
\description{
This is my first function and it sums two numbers.
}
\note{
This function is a bit boring but that is ok.
}
\examples{
my_sum(1, 2)
}
\seealso{
\link{Arithmetic} for an easier way.
}roxygen2 output (cont’d)NAMESPACE:
tests folderusethis::use_testthat() and usethis::use_test() and populate tests/testthat folder with unit teststestthat framework, then these can go into R scripts directly in tests directorydata folderusethis::use_data()data() call needed before using the datadata-raw folder, start with usethis::use_data_raw()inst folderinst/extdata foldersystem.file("path/file", package = "mypackage")CITATION: For custom citation() output
usethis::use_citation()inst/doc can contain documentation files (typically pdf)src folderC, C++ and Fortran usually works with OS native compilersvignettes folderpdf or html) created by compiling source filesusethis::use_vignette()
Rmd vignette, compiled with knitrroxygen2 chunksNEWS fileusethis::use_news_md()DESCRIPTION fileLicense field (in standardized form) is mandatoryCommon licenses for R packages: GPL-2, GPL-3, AGPL-3, MIT, …
Details and description of most licenses are available online:
Examples of standardized license specifications:
License: GPL-2
License: LGPL (>= 2.0, < 3) | Mozilla Public License
License: GPL-2 | file LICENCE
License: Artistic-2.0 | AGPL-3 + file LICENSE
LICENSE/LICENCE contains a copy of the license
License fieldOnce again, functions from the usethis package simplify this process:
usethis::use_mit_license()usethis::use_gpl_license()usethis::use_agpl_license()usethis::use_lgpl_license()usethis::use_apache_license()usethis::use_cc0_license()usethis::use_ccby_license()usethis::use_proprietary_license()NAMESPACEdevtools::document()R CMD checkdevtools::check()devtools::build()R CMD INSTALLdevtools::install()devtools::load_all()tests will also be available| Description | Windows & Linux | Mac |
|---|---|---|
| Install and Restart | Ctrl+Shift+B | Shift+Command+B |
| Load All | Ctrl+Shift+L | Shift+Command+L |
| Test Package | Ctrl+Shift+T | Shift+Command+T |
| Check Package | Ctrl+Shift+E | Shift+Command+E |
| Document Package | Ctrl+Shift+D | Shift+Command+D |
DESCRIPTION fileroxygen2 documentation\(\leadsto\) We will be using this package throughout the day!
Creators (initial authors): Daniel Sabanés Bové , Liming Li , Philippe Boileau , Alessandro Gasparini
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
The source files are hosted at github.com/openstatsware/shortcourse-seoul2026, which is forked from github.com/openstatsware/shortcourse-iscb2025.
Important: to use this work you must provide the name of the creators (initial authors), a link to the material, a link to the license, and indicate if changes were made.