| name | Data in R Packages |
| description | Comprehensive guide to including data in R packages, covering exported data, internal data, raw files, documentation, and CRAN size limits |
Data in R Packages
Overview
R packages can include data in several forms: exported datasets for users, internal data for package functions, raw data files, and dynamic package state. This skill covers all data types, documentation requirements, and CRAN restrictions.
Four Types of Package Data
1. Exported Data (data/)
User-accessible datasets loaded with data() or direct reference.
Location: data/ directory
Format: .rda or .RData files
Access: data(dataset_name) or direct reference (if LazyData: true)
Documentation: Required in R/data.R
2. Internal Data (R/sysdata.rda)
Data used by package functions, not accessible to users.
Location: R/sysdata.rda
Format: Single .rda file containing multiple objects
Access: Direct reference in package code
Documentation: Not required (internal only)
3. Raw Data Files (inst/extdata/)
Non-R data files (CSV, JSON, images, etc.) for users to access.
Location: inst/extdata/
Format: Any file format
Access: system.file("extdata", "file.ext", package = "pkg")
Documentation: Optional, usually in vignettes/examples
4. Dynamic Package State (environments)
Runtime state stored in package environments.
Location: Environment created in R code
Format: In-memory R objects
Access: Getter/setter functions
Documentation: Document the getter/setter functions
Exported Data (data/)
Creating Exported Data
my_dataset <- data.frame(
id = 1:100,
value = rnorm(100),
category = sample(LETTERS[1:3], 100, replace = TRUE)
)
usethis::use_data(my_dataset, overwrite = TRUE)
This creates data/my_dataset.rda.
Multiple Datasets
dataset1 <- mtcars[1:10, ]
dataset2 <- iris[1:50, ]
usethis::use_data(dataset1, dataset2, overwrite = TRUE)
Compression Options
usethis::use_data(my_dataset)
usethis::use_data(my_dataset, compress = "xz")
usethis::use_data(my_dataset, compress = "bzip2")
usethis::use_data(my_dataset, compress = FALSE)
CRAN recommendation: Use compress = "xz" for data >1MB.
LazyData
Add to DESCRIPTION to make data available without data() call:
LazyData: true
library(mypackage)
data(my_dataset)
head(my_dataset)
library(mypackage)
head(my_dataset)
Note: LazyData loads datasets into namespace but keeps them on disk until accessed (lazy loading).
Internal Data (R/sysdata.rda)
Creating Internal Data
Internal data is for package functions only, not exported to users.
internal_lookup <- list(
codes = c(A = 1, B = 2, C = 3),
thresholds = c(low = 0.05, high = 0.95)
)
internal_constants <- list(
api_version = "v2",
default_timeout = 30
)
usethis::use_data(
internal_lookup,
internal_constants,
internal = TRUE,
overwrite = TRUE
)
All objects saved with internal = TRUE go into a single file: R/sysdata.rda
Using Internal Data
my_function <- function(code) {
value <- internal_lookup$codes[code]
}
When to Use Internal Data
Good uses:
- Lookup tables
- Large constants
- Pre-computed values (avoid recomputation)
- Default configurations
Avoid:
- Data that changes (use environments instead)
- User-facing data (use data/ instead)
- Very large objects (consider lazy loading strategies)
Raw Data Files (inst/extdata/)
Adding Raw Data Files
dir.create("inst/extdata", recursive = TRUE)
usethis::use_directory("inst/extdata")
Common file types:
- CSV, TSV, Excel files
- JSON, XML, YAML
- Images (PNG, JPEG)
- Shapefiles, GeoJSON
- Text files, logs
- Binary formats
Accessing Raw Data Files
get_example_file <- function(filename) {
system.file("extdata", filename, package = "mypackage")
}
csv_path <- system.file("extdata", "example.csv", package = "mypackage")
data <- read.csv(csv_path)
read_my_data <- function(file) {
}
inst/ vs data/
inst/extdata/ # Raw files, any format
├── example.csv # Access with system.file()
├── sample.json
└── image.png
data/ # R objects only
├── dataset1.rda # Access with data() or direct reference
└── dataset2.rda
Use inst/extdata/ when:
- Non-R formats (CSV, JSON, etc.)
- Files users need paths to
- Multiple related files
- Files for examples/vignettes
Use data/ when:
- R objects for analysis
- Data ready to use in R
- Common datasets for package functions
Documenting Data
Documenting Exported Data
Create R/data.R to document all datasets:
"who"
Required tags:
@format - describe structure and columns
- Title and description (always)
Recommended tags:
@source - where data came from
@examples - how to use the data
Data Documentation Templates
Data Frame
"transactions"
List
"config_defaults"
Vector
"palette_colors"
Matrix
"correlation_matrix"
data-raw/ Workflow
Keep data preparation scripts separate from package code.
Setup
usethis::use_data_raw("dataset_name")
This creates:
data-raw/ directory
data-raw/dataset_name.R script
- Adds
^data-raw$ to .Rbuildignore
Data Preparation Script
library(dplyr)
library(lubridate)
raw_data <- read.csv("~/Downloads/raw_customer_data.csv")
customer_data <- raw_data %>%
janitor::clean_names() %>%
mutate(
transaction_date = ymd(transaction_date),
signup_date = ymd(signup_date)
) %>%
filter(
transaction_date >= "2020-01-01",
transaction_date <= "2023-12-31"
) %>%
select(
customer_id = id,
transaction_date,
amount = transaction_amount,
category = product_category,
region = customer_region
) %>%
distinct() %>%
arrange(transaction_date)
usethis::use_data(customer_data, overwrite = TRUE, compress = "xz")
Benefits of data-raw/
- Reproducibility: Anyone can recreate the data