vec_chop  R Documentation 
vec_chop()
provides an efficient method to repeatedly slice a vector. It
captures the pattern of map(indices, vec_slice, x = x)
. When no indices
are supplied, it is generally equivalent to as.list()
.
list_unchop()
combines a list of vectors into a single vector, placing
elements in the output according to the locations specified by indices
.
It is similar to vec_c()
, but gives greater control over how the elements
are combined. When no indices are supplied, it is identical to vec_c()
,
but typically a little faster.
If indices
selects every value in x
exactly once, in any order, then
list_unchop()
is the inverse of vec_chop()
and the following invariant
holds:
list_unchop(vec_chop(x, indices = indices), indices = indices) == x
vec_chop(x, ..., indices = NULL, sizes = NULL)
list_unchop(
x,
...,
indices = NULL,
ptype = NULL,
name_spec = NULL,
name_repair = c("minimal", "unique", "check_unique", "universal", "unique_quiet",
"universal_quiet"),
error_arg = "x",
error_call = current_env()
)
x 
A vector 
... 
These dots are for future extensions and must be empty. 
indices 
For For 
sizes 
An integer vector of nonnegative sizes representing sequential
indices to slice For example,

ptype 
If 
name_spec 
A name specification for combining
inner and outer names. This is relevant for inputs passed with a
name, when these inputs are themselves named, like
See the name specification topic. 
name_repair 
How to repair names, see 
error_arg 
An argument name as a string. This argument will be mentioned in error messages as the input that is at the origin of a problem. 
error_call 
The execution environment of a currently
running function, e.g. 
vec_chop()
: A list where each element has the same type as x
. The size
of the list is equal to vec_size(indices)
, vec_size(sizes)
, or
vec_size(x)
depending on whether or not indices
or sizes
is provided.
list_unchop()
: A vector of type vec_ptype_common(!!!x)
, or ptype
, if
specified. The size is computed as vec_size_common(!!!indices)
unless
the indices are NULL
, in which case the size is vec_size_common(!!!x)
.
vec_chop()
vec_slice()
list_unchop()
vec_c()
vec_chop(1:5)
# These two are equivalent
vec_chop(1:5, indices = list(1:2, 3:5))
vec_chop(1:5, sizes = c(2, 3))
# Can also be used on data frames
vec_chop(mtcars, indices = list(1:3, 4:6))
# If `indices` selects every value in `x` exactly once,
# in any order, then `list_unchop()` inverts `vec_chop()`
x < c("a", "b", "c", "d")
indices < list(2, c(3, 1), 4)
vec_chop(x, indices = indices)
list_unchop(vec_chop(x, indices = indices), indices = indices)
# When unchopping, size 1 elements of `x` are recycled
# to the size of the corresponding index
list_unchop(list(1, 2:3), indices = list(c(1, 3, 5), c(2, 4)))
# Names are retained, and outer names can be combined with inner
# names through the use of a `name_spec`
lst < list(x = c(a = 1, b = 2), y = 1)
list_unchop(lst, indices = list(c(3, 2), c(1, 4)), name_spec = "{outer}_{inner}")
# An alternative implementation of `ave()` can be constructed using
# `vec_chop()` and `list_unchop()` in combination with `vec_group_loc()`
ave2 < function(.x, .by, .f, ...) {
indices < vec_group_loc(.by)$loc
chopped < vec_chop(.x, indices = indices)
out < lapply(chopped, .f, ...)
list_unchop(out, indices = indices)
}
breaks < warpbreaks$breaks
wool < warpbreaks$wool
ave2(breaks, wool, mean)
identical(
ave2(breaks, wool, mean),
ave(breaks, wool, FUN = mean)
)
# If you know your input is sorted and you'd like to split on the groups,
# `vec_run_sizes()` can be efficiently combined with `sizes`
df < data_frame(
g = c(2, 5, 5, 6, 6, 6, 6, 8, 9, 9),
x = 1:10
)
vec_chop(df, sizes = vec_run_sizes(df$g))
# If you have a list of homogeneous vectors, sometimes it can be useful to
# unchop, apply a function to the flattened vector, and then rechop according
# to the original indices. This can be done efficiently with `list_sizes()`.
x < list(c(1, 2, 1), c(3, 1), 5, double())
x_flat < list_unchop(x)
x_flat < x_flat + max(x_flat)
vec_chop(x_flat, sizes = list_sizes(x))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.