Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
382 views
in Technique[技术] by (71.8m points)

r - How to reverse order a vector?

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 returns NA when v is numeric(0), while user normally expect sorting nothing returns nothing, not sorting nothing returns the unavailable thing - it does make a big difference in my case.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...