R 不循环地填充列表中的元素

R 不循环地填充列表中的元素,r,list,for-loop,vectorization,R,List,For Loop,Vectorization,我试图不使用for循环为列表的元素赋值 在这里,我创建一个空列表,给它一个20的长度,并命名20个元素中的每一个 mylist <- list() length(mylist) <- 20 names(mylist) <- paste0("element", 1:20, sep = "") 我尝试了以下代码,但未达到预期效果: mylist[[]] <- sample(x = x, size = 20, replace = TRUE) # Gives an error

我试图不使用
for
循环为列表的元素赋值

在这里,我创建一个空列表,给它一个20的长度,并命名20个元素中的每一个

mylist <- list()
length(mylist) <- 20
names(mylist) <- paste0("element", 1:20, sep = "")
我尝试了以下代码,但未达到预期效果:

mylist[[]] <- sample(x = x, size = 20, replace = TRUE) # Gives an error
mylist[[1:length(mylist)]] <- sample(x = x, size = 20, replace = TRUE) # Does not give the desired result
mylist[1:length(mylist)] <- sample(x = x, size = 20, replace = TRUE) # Gives the same undesired result as the previous line of code
mylist[] <- sample(x = x, size = 20, replace = TRUE) # Gives the same undesired result as the previous line of code

mylist[[]]也许
replicate
就是你要找的

mylist <- replicate(20, sample(x = x, size = 20, replace = TRUE), simplify=FALSE)
names(mylist) <- paste0("element", 1:20, sep = "")

mylist由于您使用的是
replace=TRUE
您还可以一次生成所有400个,然后将它们拆分。如果您多次这样做,这可能比
replicate
更快。只有20次,速度差异根本不重要,使用
replicate
的tje代码可能更容易阅读和理解,因此可能是首选

foo <- sample(x = x, size = 20*20, replace = TRUE)
mylist <- split(foo, rep(1:20, each=20))

foo-Wow!我是否应该得出结论,即使我创建了一个空列表来获取值,这也是一种循环思维方式?你说得很对。我对这三种方法进行了基准测试:
replicate
split
matrix
split
位居榜首,紧随其后的是
matrix
。另外,您应该编辑最后一行代码,并将
nrow
更改为
ncol
,因为我想要的列表有20列
nrow
在这种情况下起作用,因为有400个元素,但只是为了正确性。非常感谢,修好了。另外,对于未来的读者来说,很可能矩阵的大小和复制的数量不同,时间也会有所不同。你自己情况的细节可能很重要,包括可读性的需要。@SavedByJESUS也一样:也许
lappy(seq(20,length(foo),20),function(x)foo[(x-19):x])
split
快?@alexis_laz你说得对!!!使用lapply要快得多。但是,您的代码并没有给出所需的结果,即20个元素的列表,每个元素包含20个数字;你得到了什么?[我在这里发帖只是为了避免在Aaron的回答中聊天]。如果我使用您的
x
和Aaron的代码并运行相同的
(unname(mylist)、lappy(seq(20,length(foo),20),function(x)foo[(x-19):x])
,我会得到
[1]TRUE
。我想不出有什么东西会妨碍给出正确的结果。
foo <- sample(x = x, size = 20*20, replace = TRUE)
mylist <- split(foo, rep(1:20, each=20))
mylist <- as.list(as.data.frame(matrix(foo, ncol=20)))