【问题标题】:dynamically changing list name in loop using assign?使用分配在循环中动态更改列表名称?
【发布时间】:2011-09-15 23:44:59
【问题描述】:

最好举个例子:在我看来,这段代码应该生成 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]]?谢谢!

【问题讨论】:

    标签: list r loops assign


    【解决方案1】:

    问题是你不能使用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)
    

    【讨论】:

    • +1 用于回答实际问题,但其他答案说明了它更符合 R 语言习惯,并且从长远来看可能更容易存储为列表而不是发明许多单独的列表变量跨度>
    • 是的。但可以想象,将列表存储在某个环境中(可能不是全局的)可能是有充分理由的。环境具有有时可以使它们非常有用的属性。
    • 感谢 wkmor1,这正是我想要的! Tricky 是个好词 :) 我只是真的担心名字,这个例子是假设的。我想 list2env 在这种情况下很有用吗?
    【解决方案2】:

    与其在全局环境中创建 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 个。

    【讨论】:

    • 这可能是个好习惯,因为不卫生,我往往会遇到非常混乱的环境!所以谢谢你的提醒!
    【解决方案3】:

    以下代码生成 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
      }  
    }
    

    【讨论】:

    • 从技术上讲,第一段代码创建了一个包含 10 个元素的列表(现在与具有 10 列和 100 行的 data.frame 相同(试试 str(as.data.frame(myList)))。
    • 对不起,我应该在我的帖子中更清楚,我主要对动态更改名称感兴趣!哈瓦拉伊帕克!
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2020-12-26
    • 2021-01-14
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多