- Keep track of the miscellaneous R functions that you write and reuse.
- Easiest way to distribute R code and associated data.
- Assembling a few R functions within a package will make it way easier for you to use them regularly.
01/11/2021
As Hillary Parker says in Writing an R package from scratch:
“Seriously, it doesn’t have to be about sharing your code (although that is an added benefit!). It is about saving yourself time.”
Metadata via the
DESCRIPTION file, including the name of the package, description of the package, the version of the package, and any package dependencies.
Source code via
.R files, that live in the
R/ directory.
Special
roxygen comments inside the
.R files that describe how the function operates and its arguments, dependencies, and other metadata.
The
NAMESPACE for the exported functions you have written, and the imported functions you bring in.
Tests that confirm your function “works as intended”.
Other things (installed files, compiled codem data, tutorials, vignettes).
From Building R packages with devtools and usethis by Tom Mock.
Let’s turn these temperature conversion functions into an R package.
fahr_to_celsius <- function(temp_F) {
# Converts Fahrenheit to Celsius
temp_C <- (temp_F - 32) * 5 / 9
return(temp_C)
}
celsius_to_kelvin <- function(temp_C) {
# Converts Celsius to Kelvin
temp_K <- temp_C + 273.15
return(temp_K)
}
fahr_to_kelvin <- function(temp_F) {
# Converts Fahrenheit to Kelvin using fahr_to_celsius() and celsius_to_kelvin()
temp_C <- fahr_to_celsius(temp_F)
temp_K <- celsius_to_kelvin(temp_C)
return(temp_K)
}
We will use the devtools, usethis and roxygen2 packages, which make creating packages in R relatively simple.
library("usethis")
## Warning: package 'usethis' was built under R version 4.0.5
library("devtools")
## Warning: package 'devtools' was built under R version 4.0.5
library("roxygen2")
## Warning: package 'roxygen2' was built under R version 4.0.5
These can be installed from CRAN like this:
# installation can be combined
install.packages(c("usethis","devtools","roxygen2"))
Set your working directory, and then use the create_package() to make a framework for your package.
# Keep the name simple and unique:
usethis::create_package("tempConvert")
Alternatively,
Add your functions to the R directory. Place each function into a separate R script:
fahr_to_celsius <- function(temp_F) {
temp_C <- (temp_F - 32) * 5 / 9
return(temp_C)
}
Alternatively usethis::use_r("fahr_to_celsius.R"). This will create a minimal function .R file and open it for interactive editing. We can copy our fahr_to celsius function over and add it to this file.
The way it works is that you add special comments to the beginning of each function, that will later be compiled into the correct format for package documentation. For example:
#' Converts Fahrenheit to Celsius
#'
#' This function converts input temperatures in Fahrenheit to Celsius.
#' @param temp_F The temperature in Fahrenheit.
#' @return The temperature in Celsius.
#' @export
#' @examples
#' fahr_to_celsius(32)
fahr_to_celsius <- function(temp_F) {
temp_C <- (temp_F - 32) * 5 / 9
return(temp_C)
}
Now you need to create the documentation from your annotations earlier.
The roxygen2 package reads lines that begin with #' as comments to create the documentation for your package. Descriptive tags are preceded with the @ symbol. For example, @param has information about the input parameters for the function. Now, we will use roxygen2 to convert our documentation to the standard R format.
devtools::document()
This automatically adds in the .Rd files to the man directory, and adds a NAMESPACE file to the main directory.
Take a look at the package directory now. The /man directory has a .Rd file for each .R file with properly formatted documentation.
Overall, your package directory should look something like this:
Run this from the parent working directory that contains the tempConvert folder.
devtools::install("tempConvert")
Let’s load the package and take a look at the documentation.
library(tempConvert)
Notice there is now a tempConvert environment that is the parent environment to the global environment.
Now that our package is loaded, let’s try out some of the functions.
fahr_to_celsius(32)
## [1] 0
Try typing ?fahr_to_celsius
source()-ing:
Creating an R Package by Sahir Rai Bhatnagar
Building R packages with devtools and usethis by Tom Mock
R packages by Hadley Wickham