v <- c()
i <- 1
while (some_condition) {
v[i] <- some_value
i <- i + 1
}
因此,我知道每次修改v都会进行复制并移动v。这显然很慢。在其他语言中,这似乎是一个琐事问题。在R中执行此操作的有效方法是什么?
答案 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