web-dev-qa-db-fra.com

Comment inverser l'ordre d'un vecteur?

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.

48
Tankman六四

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.

71
Julius Vainora