2015-10-22 23 views
2

我想通過找到的矢量的平均理解R中循環X < - 1:10理解不同種類中的R循環(對於重複,而)

有3種不同種類的循環的和我有解決這個問題的代碼,但我需要分解每一個來了解每一行的功能。

第一個是for循環。

x <- 1:10 
total <- length(x) 
x_sum <- 0 
for (i in seq_along(x)) { 
    x_sum <- x_sum + x[i] 
} 
x_sum/total 
## [1] 5.5 

我不明白爲什麼x_sum <- 0在最初的部分,爲什麼x_sum <- x_sum + x[i]。我是1,2,...,10的seq嗎?

第二個是一個重複循環。

x <- 1:10 
total <- length(x) 
x_sum <- 0 
i <- 1 
repeat { 
    x_sum <- x_sum + x[i] 
    if (i == total) break 
    i <- i + 1 
} 
x_sum/total 
## [1] 5.5 

我真的不明白這一個,並且逐行詳盡的解釋會很棒。變量我真的把我拋棄了。

回答

5

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]