在R中,什么是填充未知大小向量的有效方法?

时间:2018-11-30 17:01:46

标签: arrays r dynamic

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

因此,我知道每次修改v都会进行复制并移动v。这显然很慢。在其他语言中,这似乎是一个琐事问题。在R中执行此操作的有效方法是什么?

1 个答案:

答案 0 :(得分:1)

据我所知,没有一种本机方法可以在不将其长度不断写入内存的情况下填充未知长度的向量。也许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