x_sum初始化
x_sum
初始設置爲0,因爲如果在右手側的所有變量定義後聲明
x_sum <- x_sum + x[i]
纔會工作。假如x_sum
如果沒有定義這個聲明會發出錯誤的第一次被調用。第一次通過循環時,這會將x_sum
設置爲x_sum+x[1]
,但x_sum
爲0,因此x_sum
將設置爲x[1]
的值爲1.在後續迭代中,將使用x_sum
的先前值。
我迭代
甲for
環路形式for(i in v) { ...body... }
的運行體一次矢量v
的每個元素。在這種情況下,載體是seq_along(x)
其值我們可以明確地顯示這樣的:
> x <- 1:10
> seq_long(x)
[1] 1 2 3 4 5 6 7 8 9 10
所以第一次循環運行i被設置爲1,第二個時間2等。循環運行我的最後一次設置爲10
加入cat
語句插裝代碼
我們可以找出是怎麼回事。我們將爲for
聲明顯示它:
x <- 1:10
total <- length(x)
x_sum <- 0
for (i in seq_along(x)) {
cat("A: i:", i, "x[i]:", x[i], "x_sum:", x_sum, "\n") # <----------
x_sum <- x_sum + x[i]
cat("B: i:", i, "x[i]:", x[i], "x_sum:", x_sum, "\n\n") # <----------
}
x_sum/total
## [1] 5.5
運行上面我們得到這個輸出。每次迭代以A開始並以B結束,所以在第一次迭代中i
爲1且x[i]
爲1且x_sum
爲0且x_sum
從A線上的0遞增到B線上的1。在第二次迭代i
是2和x[i]
是2和x_sum
被1至3等遞增。 (下面繼續。)
A: i: 1 x[i]: 1 x_sum: 0
B: i: 1 x[i]: 1 x_sum: 1
A: i: 2 x[i]: 2 x_sum: 1
B: i: 2 x[i]: 2 x_sum: 3
A: i: 3 x[i]: 3 x_sum: 3
B: i: 3 x[i]: 3 x_sum: 6
A: i: 4 x[i]: 4 x_sum: 6
B: i: 4 x[i]: 4 x_sum: 10
A: i: 5 x[i]: 5 x_sum: 10
B: i: 5 x[i]: 5 x_sum: 15
A: i: 6 x[i]: 6 x_sum: 15
B: i: 6 x[i]: 6 x_sum: 21
A: i: 7 x[i]: 7 x_sum: 21
B: i: 7 x[i]: 7 x_sum: 28
A: i: 8 x[i]: 8 x_sum: 28
B: i: 8 x[i]: 8 x_sum: 36
A: i: 9 x[i]: 9 x_sum: 36
B: i: 9 x[i]: 9 x_sum: 45
A: i: 10 x[i]: 10 x_sum: 45
B: i: 10 x[i]: 10 x_sum: 55
> x_sum/total
[1] 5.5
> ## [1] 5.5
嘗試以相同的方式檢測repeat
循環。
展開循環
事實上初始化和循環,相當於運行以下命令:
x_sum <- 0
x_sum <- x_sum + x[1]
x_sum <- x_sum + x[2]
x_sum <- x_sum + x[3]
x_sum <- x_sum + x[4]
x_sum <- x_sum + x[5]
x_sum <- x_sum + x[6]
x_sum <- x_sum + x[7]
x_sum <- x_sum + x[8]
x_sum <- x_sum + x[9]
x_sum <- x_sum + x[10]