在R中,在循环中扩展数据结构效率低下。我如何预分配指定大小的list
?matrix
可以通过ncol
和nrow
参数轻松实现此功能。那么在列表中该怎么做呢?例如:
x <- list()
for (i in 1:10) {
x[[i]] <- i
}
我认为这种方法不够高效。有什么更好的做法吗?
在R中,在循环中扩展数据结构效率低下。我如何预分配指定大小的list
?matrix
可以通过ncol
和nrow
参数轻松实现此功能。那么在列表中该怎么做呢?例如:
x <- list()
for (i in 1:10) {
x[[i]] <- i
}
我认为这种方法不够高效。有什么更好的做法吗?
vector
可以创建所需模式和长度的空向量。
x <- vector(mode = "list", length = 10)
继续 @Jilber 的回答,lapply
是专门为这种类型的操作而设计的。
你可以使用 lapply
来替代 for 循环:
x <- lapply(1:10, function(i) i)
你可以将此扩展到更复杂的例子。通常,for循环体中的内容可以直接转换为一个函数,该函数接受类似于循环的每次迭代中所看到的行的单个行。
x <- lapply(1:10, c)
来避免匿名函数。在我的机器上,这种方法快 2.5 微秒。 - Brian Albert Monroe类似这样:
x <- vector('list', 10)
所有三个现有的答案都很好。
vector()
函数可以创建一个 列表 的原因在 JennyBC's purrr tutorial 中有解释:
在 R 中,列表实际上仍然是一个向量,但它不是原子向量。 我们使用 list() 显式地构造一个列表,但是像原子向量一样,大多数列表在实际生活中以其他方式创建。
list <- vector(mode = "list", length = 10)
vec <- rep(NA, 10)