【发布时间】:2013-09-26 19:49:17
【问题描述】:
假设我有一个向量v,我如何得到它的反向,即最后一个元素在前?
我首先想到的是v[length(v):1],但是当v 是numeric(0) 时它返回NA,而用户通常期望排序什么都不返回,不排序返回不可用的东西——它确实很重要我的情况有所不同。
【问题讨论】:
假设我有一个向量v,我如何得到它的反向,即最后一个元素在前?
我首先想到的是v[length(v):1],但是当v 是numeric(0) 时它返回NA,而用户通常期望排序什么都不返回,不排序返回不可用的东西——它确实很重要我的情况有所不同。
【问题讨论】:
你快到了; rev 满足您的需求:
rev(1:3)
# [1] 3 2 1
rev(numeric(0))
# numeric(0)
原因如下:
rev.default
# function (x)
# if (length(x)) x[length(x):1L] else x
# <bytecode: 0x0b5c6184>
# <environment: namespace:base>
在numeric(0) 的情况下,length(x) 返回 0。由于if 需要一个逻辑条件,它会将length(x) 强制转换为TRUE 或FALSE。碰巧as.logical(x) 是FALSE,而x 是0,TRUE 是任何其他数字。
因此,if (length(x)) 精确测试您想要的 - x 的长度是否为零。如果不是,length(x):1L 具有理想的效果,否则无需反转任何内容,正如@floder 在评论中解释的那样。
【讨论】:
v <- c(): length(v):1 是 0:1 的情况下 OP 发生了什么。 [ 运算符忽略 0 并返回 v[1],即 NA。如果不是rev,那么健壮且符合 OP 的内容将是 v[seq(to = 1, by = -1, length.out = length(v))]。