2016-01-21 74 views
-2

我必須創建一個for循環,它將矢量z1,正方形,然後用這些矢量創建矢量z2(是的,我知道有矢量化,但這是一個家庭作業問題)。除了某些原因,它增加了一個拖尾元素到所述向量,我已經把所有東西都弄下來了。爲什麼R向我的矢量添加額外的元素?

z1 <- c(1, 8, 19, 17, 65, 103, 48, 17, 23, 34) 

# Sort z1 in descending order 
z1 <- sort(z1, decreasing = TRUE) 

# Create empty vector z2 
z2 <- c() 

for (i in 1:10){ 
z2[i] <- z1[i]*z1[i] 
z2 <- c(z2,z2[i]) 
} 

print(z2) 

這裏是矢量它打印

[1] 10609 4225 2304 1156 529 361 289 289 64  1  1 

如果您發現有11個元素,而我原來的Z1向量只有10.爲什麼?

+3

爲什麼不使用'^ Z1 2'?但是你需要放棄這條線:'z2 < - c(z2,z2 [i])',因爲當'z2 [10]'到達'z2'已經完全分配了。 –

+0

我的預期輸出是 [1] 10609 4225 2304 1156 529 361 289 289 64 1 – Dreambolic

+0

另外@RichardScriven如果我刪除那條線我該如何構造顯示這些值的新矢量?我知道簡單的方法是z1^2,但問題需要我使用for循環。 – Dreambolic

回答

3

第一點:通過使用向量化的原始函數,您可以在沒有循環的情況下執行此操作。

z1^2 
# [1] 10609 4225 2304 1156 529 361 289 289 64  1 

但是,您的代碼中發生了什麼。基本上你需要刪除線

z2 <- c(z2, z2[i]) 

因爲前行,你已經完成了z2矢量的分配,使最後的奔跑與c(z2[1:10], z2[10])。如果你想繼續使用循環,只需刪除該行。

## note the difference in initializing z2 
## memory allocation is more efficient than building in the loop 
z2 <- vector(typeof(z1), length(z1)) 

for (i in seq_along(z2)) { 
    z2[i] <- z1[i]*z1[i] 
} 

然後我們有

z2 
# [1] 10609 4225 2304 1156 529 361 289 289 64  1 
+0

注意,定義z2的長度不是必須的,你可以指定z2 <-c(),然後z [3] < - 1將填充na的第一個和第二個位置。 – latorrefabian

+2

不必要,但爲向量分配內存效率更高。 –

相關問題