如何在R中编写for循环批量初始化列表元素为空vector
错误排查与列表初始化解决方案
1 原代码问题定位
- 索引语法错误:R中操作列表的单个元素必须使用双中括号
[[]],你写的l_dtest[i]用单中括号返回的是长度为1的子列表,和空向量的赋值目标类型不匹配 - 赋值逻辑错误:
(l_dtest[i]<-vector())<-i属于无效的嵌套赋值语法,运行会直接抛出could not find function "(<-"的报错,你不需要额外把循环变量i赋值给已经设置为空向量的列表元素,这行逻辑完全不符合需求
2 正确的初始化实现
2.1 符合要求的for循环版本
完全匹配你需要的逐元素赋值空向量的逻辑:
n <- 4 # 可自定义为任意值,比如100 l_dtest <- list() for(i in 1:n){ l_dtest[[i]] <- vector() }
运行后可以用str(l_dtest)验证结构,会得到长度为n、每个元素都是空向量的列表。
2.2 更高效的向量化写法
如果不需要强制用for循环,R内置的replicate函数可以一步完成初始化,代码更简洁:
n <- 100 l_dtest <- replicate(n, vector(), simplify = FALSE)
3 后续MRCA模拟注意事项
结合你提供的示例代码,后续开发时要注意两点:
- 每一代子代个体抽样到2个亲本后,分别对两个亲本对应的谱系集合做
union合并,保证每个个体的谱系不会出现重复值 - 终止迭代的判断条件:当所有列表元素的内容完全一致,即所有个体的共同祖先只有1个时,即可停止计数,返回当前累计的世代数
内容的提问来源于stack exchange,提问作者Charles-David Bisson
相关产品推荐
相关产品推荐

