嵌套for循环的结果与独立函数

时间:2017-02-22 18:51:28

标签: r for-loop

我正在为一个名为' snp1'的变种计算Hardy-Weinberg检验能力的循环。 (使用HWPower命令,来自HardyWeinberg包)。该命令需要输入n(样本大小)和pA(次要等位基因频率)。我必须使用大量的ns和PA分别进行多次计算,因为它们代表不同的人口样本,所以我手动完成前两个,但现在我想为所有其他人做一个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

我不知道导致不一致的问题在哪里。这很奇怪,因为它只在第一个结果中,而不在第二个结果中(第二个计算的功率是好的,它给了我相同的结果,但第一个没有)。

1 个答案:

答案 0 :(得分: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)