The {container} package offers an enhanced version of base R’s list
with a carefully designed set of extract, replace, and remove operations
that make it easier and safer to work with list-like data structures.
{container} objects work similar to base R lists and on top provide
NULL)In addition, {container} provides specialized data structures Deque,
Set, and Dict and a special class
dict.table, designed to extend
data.table by container
operations to safely Manage data columns with
dict.table.
# Install release version from CRAN
install.packages("container")
# Install development version from GitHub
# devtools::install_github("rpahl/container")
install.packages("container", repos = c('https://rpahl.r-universe.dev', 'https://cloud.r-project.org'))
library(container)
co <- container(colors = c("Red", "Green"), numbers = c(1, 2, 3), data = cars)
co
# [colors = ("Red" "Green"), numbers = (1 2 3), data = <<data.frame(50x2)>>]
Use like a base R list
co[["colors"]] <- c("Blue", "Yellow")
co[["colors"]]
# [1] "Blue" "Yellow"
co[2:1]
# [numbers = (1 2 3), colors = ("Blue" "Yellow")]
Safe extract
at(co, "colours") # oops
# Error: index 'colours' not found
at(co, "colors")
# [colors = ("Blue" "Yellow")]
Safe remove
co <- delete_at(co, "colours") # oops
# Error: names(s) not found: 'colours'
co <- delete_at(co, "colors")
co
# [numbers = (1 2 3), data = <<data.frame(50x2)>>]
Flexible peek
at(co, "colors") # oops
# Error: index 'colors' not found
peek_at(co, "colors")
# []
peek_at(co, "colors", .default = c("black", "white"))
# [colors = ("black" "white")]
Safe replace
co <- replace_at(co, num = 1:10) # oops
# Error: names(s) not found: 'num'
co <- replace_at(co, numbers = 1:10)
co
# [numbers = (1L 2L 3L 4L ...), data = <<data.frame(50x2)>>]
Don’t bother using the {container} framework when speed is of high
importance. An exception is the dict.table class, which is very fast
as it is based on
data.table. Other than
that, if computation speed is critical for your application, we refer
you to using base R lists or packages that were optimized for
performance, such as the
collections or
cppcontainers
package.