【问题标题】:For loop cannot store output of looped functionFor循环不能存储循环函数的输出
【发布时间】: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 个元素的列表列表,其中每个元素的大小在每个步骤中都会增长。

标签: r loops for-loop


【解决方案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
}

【讨论】:

  • 真正的答案是简化和保留之间的区别。 [ 将简化,[[ 将保留。我在下面的答案产生了与这个答案完全相同的结果,可以使用set.seedidentical 进行测试。发帖人的代码不起作用的原因是因为他要求用[ 进行简化,而不是用[[ 保留。
  • 如果另一种解决方案产生“完全相同的结果”,那么它不是“真正的答案”,而是另一种答案。
  • 通过真正的答案,我的意思是问题是由简化与保留引起的。了解列表中保存和简化之间的区别可以让人们理解为什么原始代码没有产生正确的答案。 “真正”的答案是解释列表中的简化和保留。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2021-09-12
    • 1970-01-01
    • 2020-02-20
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多