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
。
我正在尝试 '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
。