length
and nrow
, anylength
provides the appropriate polymorphism to return the
proper value. When working with libraries, it is easy to forget the
return type of a function, particularly when there are a
lot of switches between vectors, matrices, and other data
structures. This function along with its
anynames
counterpart provides a single
interface for accessing this information across objects
The core assumption is that in most cases length is
semantically synonymous with nrow
such that the
number of columns in two-dimensional structures is less
consequential than the number of rows. This is
particularly true of time-based objects, such as zoo or
xts where the number of observations is equal to the
number of rows in the structure.
When working with functions that are polymorphic,
lambda.r
function clauses with guard conditions on
the length of the input data structure can use
anylength
instead of using length
or
nrow
, which preserves polymorphism and reduces the
number of function clauses necessary. For example,
instead of one clause to check length
and another
to check nrow
, anylength
can test for both
situations in a single clause.
slice(x, expression) %::% a : logical : list
slice(x, expression) %when% { length(expression) == length(x) }
slice(x, expression) %::% a : logical :
slice(x, expression) %when% { length(expression) == nrow(x) }
These two clauses can be replaced with
slice(x, expression) %::% a : logical : .
slice(x, expression) %when% { length(expression) == anylength(x) }
Another use of anylength
is when working with
sapply
. The output value is governed by the result
of the higher-order function, so it is difficult to know
a priori whether the result will be a vector or a matrix.
With anylength
it doesn't matter since the same
function is used in either case.
# Get the rows of the matrix
anylength(matrix(c(1,2,3,4,5,6), ncol=2))
# Get the length of the vector
anylength(c(1,2,3,4,5))
Run the code above in your browser using DataLab