我有一个模拟遗传漂移的功能,我想将它循环到每个参数的多个值上 功能如下:
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
我怀疑问题可能在于将输出存储到矩阵中,并且函数可能无法正确访问矩阵,但我不确定。
谢谢!
答案 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
}
答案 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])
当连接列表时,将发生以下两种情况之一:保留或简化。您的代码使用[
,因此尝试简化。因为每次迭代的矩阵都是不同的维度,所以简化会产生错误。但是如果你使用[[
,则连接将使用保留,结果将是一个不断增加的矩阵列表。接受的答案将连接从矩阵的连接更改为列表的连接。在这种情况下,[
保留列表,而不是矩阵,代码根据需要运行。