| lengths {base} | R Documentation |
Lengths of List or Vector Elements
Description
Get the length of each element of a list or atomic
vector (is.atomic) as an integer or numeric vector.
Usage
lengths(x, use.names = TRUE)
Arguments
x |
a |
use.names |
logical indicating if the result should inherit the
|
Details
This function loops over x and returns a compatible vector
containing the length of each element in x. Effectively,
length(x[[i]]) is called for all i, so any methods on
length are considered.
lengths is generic: you can write methods to handle
specific classes of objects, see InternalMethods.
Value
A non-negative integer of length length(x),
except when any element has a length of more than
2^{31}-1 elements, when it returns a double vector.
When use.names is true, the names are taken from the names on
x, if any. The result has the same dimensions as x.
Note
One raison d'ĂȘtre of lengths(x) is its use as a
more efficient version of sapply(x, length) and similar
*apply calls to length. This is the reason why
x may be an atomic vector, even though lengths(x) is
trivial in that case.
See Also
length for getting the length of any R object.
Examples
require(stats)
## summarize by month
l <- split(airquality$Ozone, airquality$Month)
avgOz <- lapply(l, mean, na.rm=TRUE)
## merge result
airquality$avgOz <- rep(unlist(avgOz, use.names=FALSE), lengths(l))
## but this is safer and cleaner, but can be slower
airquality$avgOz <- unsplit(avgOz, airquality$Month)
## should always be true, except when a length does not fit in 32 bits
## or l has dimensions
stopifnot(identical(lengths(l), vapply(l, length, integer(1L))))
## empty lists are not a problem
x <- list()
stopifnot(identical(lengths(x), integer()))
## nor are "list-like" expressions:
lengths(expression(u, v, 1+ 0:9))
## and we should dispatch to length methods
f <- c(rep(1, 3), rep(2, 6), 3)
dates <- split(as.POSIXlt(Sys.time() + 1:10), f)
stopifnot(identical(lengths(dates), vapply(dates, length, integer(1L))))