为什么当我给 R 中的两个列表元素命名时没有错误

Why there is no error when I give same name to two list elements in R

我在使用 R 进行一些实践时遇到了这个问题。这是场景,

v = list(bob=c(2,3,5),bob=c("aa","bb"))

我有一个名为 v 的列表,并且有两个列表元素都命名为 bob。当我编译它时,它没有给出任何错误。但最有趣的因素是,如果我尝试使用 list name 打印 bob,它会给我这个结果,

> v$bob
[1] 2 3 5

但是如果我使用 attach() 命令打印 bob 它 returns 另一种方式。

> attach(v)
> bob
[1] "aa" "bb"
> detach(v)

这两个不同的结果让我很好奇,请有人帮助理解下划线理论。

对于 attach,它会覆盖第一个 'bob',即最后一个条目的 2、3、5。如果我们想反转它,使用 rev 它只是反转列表元素的顺序,因此列表的第一个元素现在将是最后一个

attach(rev(v))

-检查

> bob
[1] 2 3 5

一般来说,建议不要使用attach

如果我们想为特定元素创建对象,请使用 assign

assign(names(v)[1], v[[1]])

关于 why there is no error in duplicate names of a list 的问题,list 有重名,matrix 也有重名。但是,在 data.frame 中,这是不允许的,因为有检查重复项的功能,即 make.unique 从而保证唯一的名称

make.unique(c('bob', 'bob'))
[1] "bob"   "bob.1"

即如果我们将 list 转换为 data.frame(在校正 length 之后,即使 lengthlist 元素相同 - data.framelist 除了一些更多的属性外,其元素的长度相等)

data.frame(lapply(v, `length<-`, max(lengths(v))))
  bob bob.1
1   2    aa
2   3    bb
3   5  <NA>