我在使用 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)
这两个不同的结果让我很好奇,请有人帮助理解下划线理论。
使用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.frame是list其元素长度相等的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)