当负索引可能是integer(0)时,如何安全地从向量中删除任何内容?

时间:2018-10-12 04:33:17

标签: r vector

假设我有一个向量x = 1:10,它是通过将两个其他向量a = integer(0)b = 1:10串联在一起而构造的(这是一种边缘情况)。我想稍后将组合的向量再次拆分为ab。我本以为可以安全地将它们分开:

i = seq_along(a)
x[i]
x[-i]

但是我发现,当我使用x[-integer(0)]时,我得到integer(0)的返回,而不是我天真地认为的x本身。做这种事情的最好方法是什么?

1 个答案:

答案 0 :(得分:2)

如果您想使用负索引,并且索引可能会退化为integer(0)(例如,索引是根据which计算的),请在“指数。删除“越界”值没有副作用。

x <- 1:10
i <- integer(0)
x[-c(i, 11)]  ## position 11 is "out-of-bound"
# [1]  1  2  3  4  5  6  7  8  9 10

如果您麻烦设置此“越界”值,则可以使用以下规范选择:2 ^ 31,因为该值超出了32位带符号整数的表示范围,但不是{{1 }}。


另一种方法是对Inf进行if测试。例如:

length(i)

警告:请勿为此目的使用功能if (length(i)) x[-i] else x