Supposons que j'ai un vecteur v
, comment puis-je obtenir son inverse, c'est-à-dire le dernier élément en premier?
La première chose qui me vient est v[length(v):1]
, mais elle retourne NA lorsque v
est numeric(0)
, tandis que l'utilisateur attend normalement que rien ne renvoie rien, pas de tri ne retourne le chose indisponible - cela fait une grande différence dans mon cas.
Tu es presque là; rev
fait ce dont vous avez besoin:
rev(1:3)
# [1] 3 2 1
rev(numeric(0))
# numeric(0)
Voici pourquoi:
rev.default
# function (x)
# if (length(x)) x[length(x):1L] else x
# <bytecode: 0x0b5c6184>
# <environment: namespace:base>
Dans le cas de numeric(0)
, length(x)
renvoie 0. Comme if
requiert une condition logique, il contraint length(x)
à TRUE
ou FALSE
. Il arrive que as.logical(x)
soit FALSE
lorsque x
est 0 et TRUE
pour tout autre nombre.
Ainsi, if (length(x))
teste précisément ce que vous voulez - si x
est de longueur zéro. Si ce n'est pas le cas, length(x):1L
a un effet souhaitable, et sinon il n'est pas nécessaire d'inverser quoi que ce soit, comme @floder l'a expliqué dans le commentaire.