嵌套循环递归索引列表问题:30×30列表仅返回30个元素
问题分析
你代码里的binom最终是包含30个子列表的列表,每个子列表有30个元素,所以length(binom)返回30,而非你预期的900。原因是你用binom[i][[j]]赋值时,是把结果放到第i个元素的子列表中,而非直接添加到binom的顶层。
解决方案
如果你需要的是包含900个元素的一维列表,可以按以下方式修改代码:
x1 <- rnorm(30,1, 1) z1 <- rnorm(30,0 ,2) probit <- numeric(length(x1)) # 预初始化向量更高效 binom <- vector("list", 30*30) # 预定义长度900的列表 for(i in seq_along(x1)){ probit[i] <- pnorm(-1 + x1[i] + 0.4*z1[i]) for(j in seq_along(z1)){ # 先计算值,避免打印和赋值的随机结果不一致 current_val <- rbinom(30, j, probit[i]) print(current_val) # 计算一维列表的索引位置 idx <- (i - 1)*30 + j binom[[idx]] <- current_val } } length(binom) # 现在输出900
如果你实际需要的是30×30的二维嵌套列表(30个各含30元素的子列表),当前代码的结构是对的,但length(binom)本身就是30。要统计总元素数可以用:
sum(sapply(binom, length)) # 返回900
另外,预初始化probit和binom比动态扩展空向量/列表的效率更高,也更规范。
内容的提问来源于stack exchange,提问作者Working dollar
相关产品推荐
相关产品推荐

