2011-12-08 62 views
7

没有名称的列表返回NULL其名称:获取列表元素的名称一致的矢量

> names(list(1,2,3)) 
NULL 

但增加了一个名为事情,突然名称具有列表的长度:

> names(list(1,2,3,a=4)) 
[1] "" "" "" "a" 

因为这现在是一个命名清单。我想是一个函数,rnames说,做任何列表到一个名为列表,使得:

rnames(list(1,2,3)) == c("","","") 
identical(rnames(list()), character(0)) 
length(rnames(foo)) == length(foo) # for all foo 

及以下,这是什么名字()做反正:

rnames(list(1,2,3,a=3)) == c("","","","a") 
rnames(list(a=1,b=1)) == c("a","b") 

我现在哈克的方法是一个名叫事情添加到列表中,得到的名称,然后砍了下来:

rnames = function(l){names(c(monkey=1,l))[-1]} 

,但有没有做这更好/有道?

回答

4

,感觉比较清爽,干净的一个方法是指定名称列表:

x <- list(1,2,3) 
names(x) <- rep("", length(x)) 
names(x) 
[1] "" "" "" 

把它变成一个功能:

rnames <- function(x){ 
    if(is.null(names(x))) names(x) <- rep("", length(x)) 
    return(x) 
} 

测试用例:

x1 <- rnames(list(1,2,3)) 
x2 <- rnames(list(1,2,3,a=3)) 
x3 <- rnames(list(a=1,b=1)) 

names(x1) 
[1] "" "" "" 

names(x2) 
[1] "" "" "" "a" 

names(x3) 
[1] "a" "b" 
+0

足够接近:)我的rnames返回的是名称而不是重命名的列表,但重命名的列表可能很有用。我希望有一个函数可以将列表转换为命名列表。找不到一个... – Spacedman

1

名称属于名称...名称:

> lis2 <- list("a", "b") 
> attributes(lis2) 
NULL 

> if(is.null(names(lis2))) {names(lis2) <- 
         vector(mode="character", length=length(lis2))} 
> lis2 
[[1]] 
[1] "a" 

[[2]] 
[1] "b" 

> names(lis2) 
[1] "" "" 

> attributes(lis2) 
$names 
[1] "" "" 
1

这样的事情呢?

rnames <- function(x) { 
    if(is.null(names(x))) 
     character(length(x)) 
    else 
     names(x) 
} 

它处理list()并没有名称的情况;如果已经有名字,它什么也不做。