←
PDF 345 / 520 Unknown Output Length
→
English · PDF 345
Original PDF page 345
中文 · PDF 345

如果你要创建命名输出,请确保像下面这样为结果向量命名:

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 ...