【问题标题】:Inconsistency between the result of nested for loop and the independent function嵌套for循环结果与独立函数不一致
【发布时间】:2017-02-22 18:51:28
【问题描述】:

我正在创建一个循环,用于计算名为“snp1”的变体的 Hardy-Weinberg 测试的功效(使用 HWPower 命令,来自 HardyWeinberg 包)。此命令需要输入 n(样本大小)和 pA(次要等位基因频率)。我必须用大量的 ns 和 pAs 进行多次单独的计算,因为它们代表不同的人口样本,所以我手动完成了前两个,但现在我想为所有其他人创建一个 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

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

【问题讨论】:

  • 您将 HWpowersnp1&lt;-numeric(2) 定义为大小为 2 的数字数组,因此您应该在循环结束时获得两个值。在第二次调用时,它返回一个应有的标量值。

标签: r for-loop


【解决方案1】:

你的双循环是错误的。如果你运行这个

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)

【讨论】:

  • 谢谢!我现在发现我误解了 mapply 的用法,这就是我一开始没有使用它的原因。非常感谢你!解决了。​​
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多