for循环不能存储循环函数的输出

时间:2018-03-21 00:25:22

标签: 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: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

我怀疑问题可能在于将输出存储到矩阵中,并且函数可能无法正确访问矩阵,但我不确定。

谢谢!

2 个答案:

答案 0 :(得分:1)

你必须在填充循环中的新列表的任何for循环中添加list():

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
}

enter image description here

答案 1 :(得分:0)

老实说,我不完全确定你想要什么,但这会给你你想要的东西吗?我在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])

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