2015-12-07 169 views
1

所以我们知道R有list()变量,并且也知道R有函数调用names()给变量名称。例如:给列表变量名称

a=30 
names(a)="number" 
a 
# number 
# 30 

但现在,我想给一个列表变量的名称,就像这样:

b=list() 
names(b)="number" 

并返回这样的错误消息:

Error in names(b) = "number" : 
'names' attribute [1] must be the same length as the vector [0] 

我有假设吗?我这样做是因为我需要很多列表变量。或者,你有另一种方法,可以在不使用名称的情况下制作很多列表变量吗?

+4

在前面的例子中,它的长度为1 ,在'list'中它的长度为0。如果你做'b = list(30);名称(b)< - 'number''应该可以工作 – akrun

+1

谢谢,这是工作! – mthbnd

回答

9

由于@akrun不需要任何更多的点,这里是你展示如何分配名称列表的例子:

lst <- list(a="one", b="two", c=c(1:3)) 
names(lst) 
[1] "a" "b" "c" 
names(lst) <- c("x", "y", "z") 

> lst 
$x 
[1] "one" 

$y 
[1] "two" 

$z 
[1] 1 2 3 
0

它好像你有兴趣标签的对象本身,而不是在它的元素。关键是列表对象的names属性必须分配给它的元素。一种选择,因为你说你有很多列表对象,就是将列表存储在一个大列表中,然后你可以给大列表分配名称,列表对象中的元素也可以被命名。

allLists <- list('number' = list()) 

> allLists 
$number 
list() 

另一种选择,你可以在Hmisc包使用label功能。它修改了R中最常用的对象,使其具有“标签”子类,因此无论何时打印列表时都会显示标签。这对于文档编制和组织工作空间来说更好一些,但要注意,非常容易意外地将标记对象转换为未标记的类,并混淆不想要搜索多个类的方法。

library(Hmisc) 
p <- list() 
label(p) <- 'number' 

> p 
number 
list() 

另一种选择是使列表对象的“名称”成为列表的实际元素。您将看到许多复杂的R数据结构,这是存储标签,标题或名称时的首选方法,当出现这种需求并且不受基本R数据结构的满足时。

b <- list('name' = 'number') 

最后一种可能性是,您需要一个占位符来存储尚未填充列表的元素的“名称”属性。如果元素是已知长度和已知类型的元素,则可以使用例如numeric(1)一种可以命名的“启动”矢量。如果你不知道输出的数据结构,那么我不会使用这种方法,因为它可能是在R中“构建”数据结构的实际内存生命。