2011-12-08 61 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()並沒有名稱的情況;如果已經有名字,它什麼也不做。