为什么当我给 R 中的两个列表元素赋予相同的名称时没有错误

Ind*_*ake 2 r data-structures

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

v = list(bob=c(2,3,5),bob=c("aa","bb"))
Run Code Online (Sandbox Code Playgroud)

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

> v$bob
[1] 2 3 5
Run Code Online (Sandbox Code Playgroud)

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

> attach(v)
> bob
[1] "aa" "bb"
> detach(v)
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 5

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

attach(rev(v))
Run Code Online (Sandbox Code Playgroud)

-查看

> bob
[1] 2 3 5
Run Code Online (Sandbox Code Playgroud)

一般情况下,建议不要使用attach

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

assign(names(v)[1], v[[1]])
Run Code Online (Sandbox Code Playgroud)

关于 a 的why there is no error重名问题,重名list是一个特征,list因为 domatrix可以有重名。但是,在 中data.frame,这是不允许的,因为存在检查重复项的功能,即make.unique因此保证唯一的名称

make.unique(c('bob', 'bob'))
[1] "bob"   "bob.1"
Run Code Online (Sandbox Code Playgroud)

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

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