R 中的奇向量循环行为

Odd vector loop behaviour in R

我正在尝试 'slice' 列表中元素的降序序列,如下所示:

test <- c(1:10)
for (i in test){
print(i:test[length(test)])
}

输出为:

 [1]  1  2  3  4  5  6  7  8  9 10
[1]  2  3  4  5  6  7  8  9 10
[1]  3  4  5  6  7  8  9 10
[1]  4  5  6  7  8  9 10
[1]  5  6  7  8  9 10
[1]  6  7  8  9 10
[1]  7  8  9 10
[1]  8  9 10
[1]  9 10
[1] 10

但是,当列表中有浮点数时,我得到一个奇怪的输出。

test <- c(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.1)

 [1]  1.1  2.1  3.1  4.1  5.1  6.1  7.1  8.1  9.1 10.1
[1] 2.2 3.2 4.2 5.2 6.2 7.2 8.2 9.2
[1] 3.3 4.3 5.3 6.3 7.3 8.3 9.3
[1] 4.4 5.4 6.4 7.4 8.4 9.4
[1] 5.5 6.5 7.5 8.5 9.5
[1] 6.6 7.6 8.6 9.6
[1] 7.7 8.7 9.7
[1] 8.8 9.8
[1] 9.9
[1] 10.1

如您所见,许多输出的元素不在原始向量中。 当使用我的实际数据集(大约 90 个元素,所有元素都是浮点数)时,当多个元素多次输出且有很多 N/A 时,这种行为变得更加奇怪。输出的快速块是:

 [1] 13.90370 13.96806 13.99962 14.05951 14.11134 14.15238 14.18557 14.22471 14.27834 14.30811 14.36219 14.40581
 [13] 14.43922 14.48592 14.52759 14.56241 14.59632 14.63917 14.66668 14.69875 14.74036 14.77602 14.81268 14.83571
 [25] 14.86539 14.90646 14.94870 14.97308 15.00642 15.03577 15.06180 15.08710 15.12115 15.14261 15.17206 15.19136
 [37] 15.21572 15.22627 15.25308 15.28468 15.30114 15.33367 15.35086       NA       NA       NA       NA       NA
 [49]       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
 [61]       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA

这是怎么回事?

我们需要遍历序列而不是 'test' 的值。在第一种情况下,它起作用是因为值是序列,而第二种情况并非如此 'test'

for(i in seq_along(test)) print(test[i:length(test)])

-输出

[1]  1.1  2.2  3.3  4.4  5.5  6.6  7.7  8.8  9.9 10.1
[1]  2.2  3.3  4.4  5.5  6.6  7.7  8.8  9.9 10.1
[1]  3.3  4.4  5.5  6.6  7.7  8.8  9.9 10.1
[1]  4.4  5.5  6.6  7.7  8.8  9.9 10.1
[1]  5.5  6.6  7.7  8.8  9.9 10.1
[1]  6.6  7.7  8.8  9.9 10.1
[1]  7.7  8.8  9.9 10.1
[1]  8.8  9.9 10.1
[1]  9.9 10.1
[1] 10.1

即当我们按值执行 : 时,它会递增 1

> 1.1:test[length(test)]
 [1]  1.1  2.1  3.1  4.1  5.1  6.1  7.1  8.1  9.1 10.1
> 2.2:test[length(test)]
[1] 2.2 3.2 4.2 5.2 6.2 7.2 8.2 9.2
> 3.3:test[length(test)]
[1] 3.3 4.3 5.3 6.3 7.3 8.3 9.3

?":"

中提到

For other arguments from:to is equivalent to seq(from, to), and generates a sequence from from to to in steps of 1 or -1.

因此,它不是 odd behavior