首页 > 解决方案 > 在 R 中,填充未知大小的向量的有效方法是什么?

问题描述

v <- c()
i <- 1
while (some_condition) {
    v[i] <- some_value
    i <- i + 1
}

所以我知道每次修改 v 时都会制作一个副本并移动 v。这显然非常缓慢。这似乎是其他语言中的琐事问题。在 R 中执行此操作的有效方法是什么?

标签: arraysrdynamic

解决方案


据我所知,没有本地方法可以填充未知长度的向量,而无需不断地将其重写到内存中。也许data.table有一些技巧?

缺乏任何复杂的解决方案,就像 12b345b6b78 建议的那样简单地预分配一个超大的向量,可以为您节省相当多的时间。

unk <- 1e5

f1 <- function(unk) {
    v <- c()
    for (i in 1:unk) {
        v[i] <- i
    }
    v
}

f2 <- function(unk) {
    v <- vector(length=unk*2)
    for (i in 1:unk) {
        v[i] <- i
    }
    v[1:i]
}

f10 <- function(unk) {
    v <- vector(length=unk*10)
    for (i in 1:unk) {
        v[i] <- i
    }
    v[1:i]
}

library(microbenchmark)
mb <- microbenchmark(f1(unk), f2(unk), f10(unk), times=50)
mb
# Unit: milliseconds
#      expr       min        lq     mean    median       uq       max neval cld
#   f1(unk) 27.177678 28.364024 32.65618 29.896673 36.18994  48.37088    50   c
#   f2(unk)  8.075867  9.025156 10.87335  9.271589 10.07932  35.29222    50 a  
#  f10(unk) 11.132773 13.071857 20.46808 15.059086 21.53610 187.00786    50  b 

推荐阅读