2017-02-22 59 views
1

我正在製作一個循環來計算稱爲'snp1'(使用HWPower命令,來自HardyWeinberg軟件包)的變體Hardy-Weinberg測試的功效。該命令需要輸入n(樣本大小)和pA(次要等位基因頻率)。我必須用許多ns和pAs分別計算許多時間,因爲它們表示不同的人口樣本,所以我手動做了前兩個,但現在我想爲所有其他人做一個for循環。 我從頭兩個簡單的循環開始,所以我可以很容易地檢查結果是否正常(並且因此循環正常工作)。但是在比較兩種計算結果時我遇到了一個問題,這使我認爲我的代碼不完全正確。嵌套for循環和獨立函數結果之間的不一致

install.packages("HardyWeinberg") 
library(HardyWeinberg) 

snp1n=c(661,503) 
snp1pA=c(0.006051,0.174) 
HWpowersnp1<-numeric(2) 

for(i in seq_along(snp1n)) { 
    for(j in seq_along(snp1pA)) { 
    HWpowersnp1[i]<-HWPower(n=snp1n[i],pA=snp1pA[j]) 
    } 
} 
HWpowersnp1 

這給了我下面的載體:

HWpowersnp1 
[1] 0.04109278 0.04253145 

但是當我他們每個人單獨使用函數計算,我得到:

HWPower(n = 661,pA = 0.006051) 
[1] 0.02107572 
HWPower(n = 503, nA = 175) 
[1] 0.04253145 

我不知道在哪裏問題在於導致不一致。這很奇怪,因爲它只有第一個結果,而不是第二個結果(第二個計算的結果是好的,它給了我相同的結果,但第一個結果沒有)。

+0

您正在定義'HWpowersnp1 <-numeric(2)'爲大小兩個的數值數組,所以你應該在循環的兩個值的結束。在第二次調用時,它會返回標量值。 –

回答

0

你的雙循環是錯誤的。如果你運行這個

for(i in seq_along(snp1n)) { 
    for(j in seq_along(snp1pA)) { 
    print(paste(i,j)) 
    HWpowersnp1[i]<-HWPower(n=snp1n[i],pA=snp1pA[j]) 
    } 
} 

你會看到你的函數運行4次,而不是你所期望的兩次。你想同時遍歷snp1nsnp1pA。所以你應該使用mapplyMap。試試這個

HWpowersnp1 <- Map(HWPower, n=snp1n, pA=snp1pA) 
+0

謝謝!我現在看到,我誤解了用戶的使用情況,這就是爲什麼我沒有使用它的原因。非常感謝你! 已解決。 – melunuge92