In an interactive R session a {container} can be used similar to a
base R list, but also provides some extra features. For
easier typing it’s recommended to use the shorter cont.
The {container} print method is designed to be very compact.
For more verbose output, either convert to a base list
…
or use str.
Both length and names work as usual.
A {container} object can also be constructed from a list.
Elements can be added by concatenation,
c(co, c = 3, d = 4)
# [A = 1, b = (1L 2L 3L 4L ...), c = 3, d = 4]
c(co, co2)
# [A = 1, b = (1L 2L 3L 4L ...), x = (1 2), y = (1 4)]or name,
and containers can be nested.
In contrast to base R list, elements cannot be
added via positional index if it exceeds the container’s length.
Single or multiple value replacement works as usual.
Note that assigning NULL does not remove the
element, but just replaces its value with NULL.
In contrast to base list, containers can take a mix of
numeric and character indices.
co[list("A", 2, "c")] <- list(1, 2, "three")
co
# [A = 1, b = 2, c = "three", co2 = [x = (1 2), y = (1 4)]]Another option is to replace by value.
This works for any data type.
The following standard access operators as known from base R can be applied.
co <- container(a = 1, b = "b", c = 3, d = "d")
co[["a"]]
# [1] 1
co[[1]]
# [1] 1
co[1:3]
# [a = 1, b = "b", c = 3]Negative indices (since version 1.1.0) also work as expected.
Due to {container} object under the hood being an environment, the
$ operator is not supported for extraction (it usually just
yields NULL). As a workaround, you could transform to a
list first.
The {container} package introduces a variety of additional extraction capabilities to make working with containers in interactive sessions even more user-friendly.
First of all, multiple indices can be provided as separate arguments,
that is, without having to wrap them in c().
co[1, 3, 4]
# [a = 1, c = 3, d = "d"]
co[TRUE, FALSE]
# [a = 1, c = 3]
co["c", "b", "a"]
# [c = 3, b = "b", a = 1]Second, indices can be mixed, in a list or, again, as separate arguments.
Since version 1.1.0, non-standard evaluation of indices is available, which allows easy definitions of ranges using numbers, unquoted names or both.
co[a:c]
# [a = 1, b = "b", c = 3]
co[2:d]
# [b = "b", c = 3, d = "d"]
co[-(b:c)]
# [a = 1, d = "d"]
co[-c("a", "d")]
# [b = "b", c = 3]This also works for replacement operations.
# Replace by NSE name range
co[a:c] <- 0
co
# [a = 0, b = 0, c = 0, d = "d"]
# Replace complement via negative NSE range
co[-(a:b)] <- 5:6
co
# [a = 0, b = 0, c = 5L, d = 6L]Warning: range expressions as shown above are truly intended for interactive use, where the result can be easily inspected and corrected by the user. They should not be used in serious programming where explicit indices are preferred to avoid unexpected results.
Invalid indices don’t produce NULLs but are just
ignored.
co <- container(a = 1, b = "b", c = 3, d = "d")
co[0:10]
# [a = 1, b = "b", c = 3, d = "d"]
co[1, "foo", "c", "bar"]
# [a = 1, c = 3]It is possible to provide a custom default value for unknown indices.
co[0:10, .default = 0]
# [a = 1, b = "b", c = 3, d = "d", 0, 0, 0, 0, 0, 0]
co[1, "foo", "c", "bar", .default = NA]
# [a = 1, foo = NA, c = 3, bar = NA]
co[1, "foo", "c", "bar", .default = "ups"]
# [a = 1, foo = "ups", c = 3, bar = "ups"]
co[1, "foo", "c", "bar", .default = 1:3]
# [a = 1, foo = (1L 2L 3L), c = 3, bar = (1L 2L 3L)]This vignette showcases how {container} enhances interactive R workflows by combining the familiarity of base R list operations with additional features:
Next, see vignette Use container for code development.