使用assign动态更改循环中的列表名称?

时间:2011-06-16 00:16:48

标签: list r loops assign

最好举一个例子:这个代码应该按照我看到的方式生成10个列表,每个列表包含100个元素。

for (i in 1:10){
assign(paste("List", i, sep="."), vector("list", length=100))
  for (j in 1:100){
    assign(paste("List", i, sep=".")[[j]], j+1)
  }
}

但它没有..第一个赋值工作正常,创建一个包含100个元素的空列表,但是如何填充元素[[j]]呢?谢谢!

3 个答案:

答案 0 :(得分:6)

不是在全球环境中制作10个列表,而是制作列表列表要简单得多:

mybiglist <- list()
for(i in 1:10) {
  mybiglist[[i]] <- list()
  for( j in 1:100 ) {
    mybiglist[[i]][[j]] <- j+1
  }
}

您可以为任何列表添加名称,也可以只通过数字下标访问这些部分。这也不会使您的全局环境受到污染,并且通常更容易调试。当你想对10个列表做一些事情时,你可以使用lapply / sapply而不需要打另一个循环。您还可以保存/加载/删除/浏览/等。一个单个对象而不是10个。

答案 1 :(得分:5)

问题是你不能使用assign为对象的元素赋值,除非你有点棘手。见下文。

for (i in 1:10){
  assign(paste("List", i, sep="."), vector("list", length=100))
  for (j in 1:100){
    assign(paste("List", i, sep="."), 
      {x <- get(paste("List", i, sep=".")) 
       x[[j]] <- j + 1 
       x})
  }
}

rm(i, j, x)

答案 2 :(得分:1)

下面的代码生成10个列表,每个列表包含100个元素。

myList = list()

for (i in 1:10) {
      myList[[i]] = 1:100
}

但是,不确定是否需要 10个向量列表 10个列表列表

如果您想要后者,您可以执行以下操作:

myList = list()

for (i in 1:10) {
  myList[[i]] = list()

  for (j in 1:100) {
      myList[[i]][[j]] = j
  }  
}