【发布时间】:2018-03-21 00:25:22
【问题描述】:
我有一个模拟遗传漂变的函数,我想在每个参数的多个值上循环它 函数如下:
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,但随后在for循环中填充了pop。您能否编辑您的问题以包含一个重现警告的最小可重现示例。 -
我复制了这个示例,它在 R v3.4.3 上为我工作,生成了一个 98 个元素的列表列表,其中每个元素的大小在每个步骤中都会增长。