如何使用循环指示器作为作业的“名称占位符”?

时间:2014-04-13 12:04:38

标签: r loops variable-assignment assign

让我跳到一个例子中:

 a <- list()
 b <- list()
 c <- list()
 i.list <- list(a,b,c)

 for(i in i.list){ i[[1]] <- "some entry" }

这不会奏效,我的问题有两个:

  • 我如何让它发挥作用?
  • 为什么不起作用?

当我使用

 for(i in i.list){ print(class(i)) }

我得到i,即循环指示符,被识别为列表,这正是我所期望的。我的理解是,当我想在列表中添加内容时,我可以使用诸如

之类的作业
 a[[1]] <- "some entry"

当我手动操作时确实有效。当在上述列表中使用时,它似乎不起作用,这让我感到困惑。我的理解是在for - 循环中发生以下情况:在第一次迭代中,i假定i.list的第一个值,并且命令应该被评估为a[[1]] <- "some entry" }。在第二次迭代中,这变为b[[1]] <- "some entry"等等。但显然,这不会发生。

任何人都可以帮助我弄清楚如何使这项工作,最重要的是清除它为什么不能工作?我对循环中发生的事情的理解有什么问题?

注意:我知道很多人会建议不要使用循环,我完全赞同。但是,我只有几个要循环的元素,for - 循环的清晰度超过了我的特定应用程序中的任何效率增益。此外,在这一刻,对我来说更重要的是要理解为什么这不起作用,因为我真的好奇地理解R内部。

1 个答案:

答案 0 :(得分:1)

这是一个范围问题,例如这表明您的解决方案&#34;工作&#34;:

for (i in i.list){ i[[1]] <- "some entry"; print(i) }

由于i仅在for循环的本地范围内定义,因此更改不会影响全局环境中i.list的元素。

这个例子应该像预期的那样工作:

for (i in seq(along=i.list)) { i.list[[i]][[1]] <- "some entry" }