2016-11-30 23 views
0

以下循環的輸出從零開始,長度爲76,而我的意圖是爲循環生成27個值。我究竟做錯了什麼?爲什麼R中的循環從0開始,而不是序列中的第一個數字?

p=0 
for(i in 50:76){ 
p[i]= choose(76,i)*.5^76 } 
p 

[1] 0.000000e+00   NA   NA   NA 
[5]   NA   NA   NA   NA 
[9]   NA   NA   NA   NA 
[13]   NA   NA   NA   NA 
[17]   NA   NA   NA   NA 
[21]   NA   NA   NA   NA 
[25]   NA   NA   NA   NA 
[29]   NA   NA   NA   NA 
[33]   NA   NA   NA   NA 
[37]   NA   NA   NA   NA 
[41]   NA   NA   NA   NA 
[45]   NA   NA   NA   NA 
[49]   NA 2.034472e-03 1.037182e-03 4.986451e-04 
[53] 2.258016e-04 9.617474e-05 3.846990e-05 1.442621e-05 
[57] 5.061829e-06 1.658185e-06 5.058870e-07 1.433347e-07 
[61] 3.759597e-08 9.095800e-09 2.021289e-09 4.105743e-10 
[65] 7.579834e-11 1.263306e-11 1.885531e-12 2.495555e-13 
[69] 2.893398e-14 2.893398e-15 2.445125e-16 1.698003e-17 
[73] 9.304128e-19 3.771944e-20 1.005852e-21 1.323489e-23 

回答

3

一般for循環中R.並不優選取而代之的是功能的家庭,apply它的後代被設計爲迭代對象,類似於其他語言如何使用循環,但是利用了內建的向量化R。你可以使用一個,sapply(),這裏是這樣的:

sapply(50:76, function(i) choose(76,i)*.5^76) 
[1] 2.034472e-03 1.037182e-03 4.986451e-04 2.258016e-04 9.617474e-05 3.846990e-05 1.442621e-05 5.061829e-06 1.658185e-06 
[10] 5.058870e-07 1.433347e-07 3.759597e-08 9.095800e-09 2.021289e-09 4.105743e-10 7.579834e-11 1.263306e-11 1.885531e-12 
[19] 2.495555e-13 2.893398e-14 2.893398e-15 2.445125e-16 1.698003e-17 9.304128e-19 3.771944e-20 1.005852e-21 1.323489e-23 

如果你真的想提前initalize一個持握物體@ G5W是正確的。如果您想要同時指定類,則可以將對象初始化爲p <- c()p <- numeric()

如果你想保持你的for循環完好,你不能指定基於索引的值。默認情況下,索引將填充1的所有值,直到您的第一個計算值(這裏是50)和NA。你可以修改這個結構:

p <- numeric() 
for(i in 50:76){ 
    j <- choose(76,i)*.5^76 
    p <- c(p, j)} 
p 
[1] 2.034472e-03 1.037182e-03 4.986451e-04 2.258016e-04 9.617474e-05 3.846990e-05 1.442621e-05 5.061829e-06 1.658185e-06 
[10] 5.058870e-07 1.433347e-07 3.759597e-08 9.095800e-09 2.021289e-09 4.105743e-10 7.579834e-11 1.263306e-11 1.885531e-12 
[19] 2.495555e-13 2.893398e-14 2.893398e-15 2.445125e-16 1.698003e-17 9.304128e-19 3.771944e-20 1.005852e-21 1.323489e-23 
+0

謝謝,彌敦道。我對「申請」系列很熟悉,但我從來不記得它是否是'sapply'或任何其他。然而,我總是訴諸循環,而且我知道我會繼續養成習慣。所以我真的想按原樣解決OP問題。我嘗試使用在帖子末尾建議的向量啓動,並且獲得與OP中相同的結果。 – Toni

+0

不錯......我會如何開始一個預先確定長度的空向量'p',像'p < - rep(0,27)',然後填充它?我知道,開始一個沒有預先確定尺寸的空向量是非常低效的。這裏索引變得很頭疼。 – Toni

+1

如果你真的想效率,你應該使用'sapply',但我想你可以做一些像@Akbar建議'P < - 數字(長度= 27); (i在50:76){ p [i-50] =選擇(76,i)* .5^76}; p' – Nate

2

當編寫p = 0時你的循環不會從0開始,它是相同的P [1] = 0,所以P [1]被定義。你的循環定義了P [50]到P [76]。然後你打印出整個清單,看到你定義的那些,加上那些你沒有觸及的NA。

當你寫p = 0時,你是否想要p = c()?

當然,你可以得到通過P [50:76]

+0

是的,我想開始一個空向量。 – Toni

+0

你的回答很有趣(+1),但裁剪結果看起來並不太「乾淨」。 – Toni

0

@ G5W你想要的27個值,這是沒有問題的。問題在於循環生成一個長度爲76的單數組。for循環中的i用於要選擇的觀察編號。您試圖強制使用動態數組編號,但它不起作用。你生成的值是50到76之間的序列。你應該在循環之後將數組設置爲p [!is.na(p)]或者改變你寫循環的方式。讓你從循環1:26,但使用一個佔位符,開始在50環和內增加+1

for(i in 1:26){ 
    j = 50 
    code ... 
    j = j+1 
} 
相關問題