如果你要创建命名输出,请确保像下面这样为结果向量命名:
results <- vector("list", length(x)) names(results) <- names(x)
按数字索引进行迭代是最通用的形式,因为给定位置后,你就可以同时提取名称和值:
for (i in seq_along(x)) { name <- names(x)[[i]] value <- x[[i]] }
未知输出长度
有时你可能不知道输出会有多长。例如,假设你想模拟一些长度随机的随机向量。你可能会想通过逐步增长向量来解决这个问题:
means <- c(0, 1, 2) output <- double() for (i in seq_along(means)) { n <- sample(100, 1) output <- c(output, rnorm(n, means[[i]])) } str(output) #> num [1:202] 0.912 0.205 2.584 -0.789 0.588 ...
但这种方法效率不高,因为在每次迭代中,R 都必须复制之前所有迭代的数据。用技术术语来说,你会得到"二次"(O(n2 )) 的行为,这意味着元素数量增加三倍时,运行时间会增加九倍(32 ) 倍)。
更好的解决方案是将结果保存在一个列表中,然后在循环结束后再合并成单个向量:
out <- vector("list", length(means)) for (i in seq_along(means)) { n <- sample(100, 1) out[[i]] <- rnorm(n, means[[i]]) } str(out) #> List of 3 #> $ : num [1:83] 0.367 1.13 -0.941 0.218 1.415 ... #> $ : num [1:21] -0.485 -0.425 2.937 1.688 1.324 ... #> $ : num [1:40] 2.34 1.59 2.93 3.84 1.3 ...