Suppose I have a vector v
, how do I get its reverse, i.e. last element first?
The first thing that comes to me is v[length(v):1]
, but it re
You are almost there; rev
does what you need:
rev(1:3)
# [1] 3 2 1
rev(numeric(0))
# numeric(0)
Here's why:
rev.default
# function (x)
# if (length(x)) x[length(x):1L] else x
# <bytecode: 0x0b5c6184>
# <environment: namespace:base>
In the case of numeric(0)
, length(x)
returns 0. As if
requires a logical condition, it coerces length(x)
to TRUE
or FALSE
. It happens that as.logical(x)
is FALSE
when x
is 0 and TRUE
for any other number.
Thus, if (length(x))
tests precisely what you want - whether x
is of length zero. If it isn't, length(x):1L
has a desirable effect, and otherwise there is no need to reverse anything, as @floder has explained in the comment.