【问题标题】:Naming list elements in RR中的命名列表元素
【发布时间】:2016-12-03 05:41:48
【问题描述】:

我最近一直在处理一些大型、复杂的列表,并且我看到了一些令人惊讶的行为(至少对我而言),主要与为列表分配名称有关。一个简单的例子:

Fil <- list(
a = list(A=seq(1, 5, 1), B=rnorm(5), C=runif(5)), 
b = list(A="Cat", B=c("Dog", "Bird"), C=list("Squirrel", "Cheetah", "Lion")),
c = list(A=rep(TRUE, 5), B=rep(FALSE, 5), C=rep(NA, 5)))

filList <- list()

for(i in 1:3){
  filList[i] <- Fil[i]
  names(filList)[i] <- names(Fil[i])
}
identical(Fil,filList)
[1] TRUE

但是:

for(i in 1:3){
  filList[i] <- Fil[i]
  names(filList[i]) <- names(Fil[i])
}
identical(Fil,filList)
[1] FALSE

我认为它让我感到困惑的主要原因是因为第一个 for 循环中第一行 names 左侧的形式需要与右侧的形式不同才能工作;我会认为这些应该是相同的。谁能给我解释一下?

【问题讨论】:

  • 我是这样想的,尽管细节可能不正确:当您运行names(filList[1]) 时,您实际上是在names 函数创建的环境中创建一个新的元素列表。然后您分配新名称,函数完成运行并且您的新列表对象被销毁。但是,当您运行 names(filList)[1] 时,您正在修改全局环境中存在的 filList 对象的名称。
  • 顺便说一句,你可以在两边使用相同的表格,比如names(x)[1] = names(y)[1]
  • 感谢 dayne 和 Frank 的解释。

标签: r list names


【解决方案1】:

第一种情况是正确的用法。在第二种情况下,您将 filList[i] 发送到 names&lt;-,这仅作为临时子集对象存在。

或者,您可以在循环之外执行所有操作:

names(filList) <- names(Fil)

【讨论】:

  • @dayne 是的,它是一个单独的副本,没有绑定到变量。
猜你喜欢
  • 2022-07-01
  • 2021-05-17
  • 2021-12-30
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多