For循环无法存储循环函数的输出

For循环无法存储循环函数的输出,r,loops,for-loop,R,Loops,For Loop,我有一个模拟基因漂移的函数,我想在每个参数的多个值上循环它 功能如下: wright.fisher<-function(p,Ne,nsim,t){ N <-Ne/2 NA1 <- 2*N*p NA2 <- 2*N*(1-p) k <- matrix(0, nrow = max(2, t), ncol = nsim) k[1,] <- rep(NA1, nsim) for (j in 1:nsim) { for (i in 2:

我有一个模拟基因漂移的函数,我想在每个参数的多个值上循环它 功能如下:

wright.fisher<-function(p,Ne,nsim,t){
  N <-Ne/2
  NA1 <- 2*N*p 
  NA2 <- 2*N*(1-p)
  k <- matrix(0, nrow = max(2, t), ncol = nsim)
  k[1,] <- rep(NA1, nsim)
  for (j in 1:nsim) {
    for (i in 2:t) {
      k[i, j] <- rbinom(1, 2*N, prob = k[i-1, j] / (2*N))
    }
  }
  k <- as.matrix(k/(2*N))
  t(k)
}
我尝试在t代漂移上循环它,但失败了,下面是我的代码:

locifreq<-runif(49, .4, 0.8)
gen <- 2:99
looppop<-list()
for (i in 2:length(gen)){
  looppop[i]<-lapply(locifreq,wright.fisher,3000,4,gen[i])
}
这样做会导致每次迭代都出现错误-

> warnings()
Warning messages:
1: In pop[i] <- lapply(locifreq, wright.fisher, 3000, 4,  ... :
  number of items to replace is not a multiple of replacement length
2: In pop[i] <- lapply(locifreq, wright.fisher, 3000, 4,  ... :
  number of items to replace is not a multiple of replacement length
我怀疑问题可能在于将输出存储到矩阵中,可能函数没有正确访问矩阵,但我不确定


谢谢

老实说,我不完全确定你想要什么,但这能给你想要的吗?我在looppop上使用了[[I]]而不是[I]

locifreq<-runif(49, .4, 0.8)
gen <- 2:99
looppop<-list()
for (i in 2:length(gen)){
  looppop[[i]]<-lapply(locifreq,wright.fisher,3000,4,gen[i])

当列表连接在一起时,将发生两件事之一:保存或简化。您的代码使用[因此尝试简化。因为每次迭代中的矩阵都是不同的维度,所以简化会产生错误。但是如果您使用[[然后,连接将使用保留,结果将是一个不断增大的矩阵列表。接受的答案将从矩阵的连接更改为列表的连接。在这种情况下[保留的是一个列表,而不是一个矩阵,代码会根据需要运行。

您必须在任何for循环中添加列表,以填充循环中的新列表:

locifreq<-runif(49, .4, 0.8)
gen <- 2:99
looppop<-list()
for (i in 2:length(gen)){
  looppop[i]<-list(lapply(locifreq,wright.fisher,3000,4,gen[i])) # note the list( addition
}

如果没有任何样本数据和可复制的示例,就很难提供帮助。我注意到您声明了looppop,但在for循环中填充了pop。请编辑您的问题,以包含一个复制警告的最小可复制示例。我复制了这个示例,它在R v3.4.3上对我有效,生成了一个98元素的li列表的st,其中每个元素的大小在每个步骤中都会增长。真正的答案是简化和保留之间的区别。[将简化和保留][[将保留。我下面的答案产生与此答案完全相同的结果,可以使用set.seed和idential进行测试。海报代码不起作用的原因是他要求使用[而不是使用[]保留]进行简化。如果替代解决方案产生“完全相同的结果”,则它不是“真正的答案”这是一个备选答案。我所说的真实答案是指问题是由简化与保留引起的。理解列表中保留和简化之间的区别,可以让人理解为什么原始代码没有产生正确的答案。真实答案是解释简化和保留在列表中显示。