2011-12-08 35 views
7

Một danh sách không có tên trả về NULL cho tên của nó:Nhận một vector phù hợp của các tên phần tử danh sách

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

nhưng thêm một tên điều và đột nhiên những cái tên có độ dài của danh sách:

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

vì đây hiện là danh sách có tên. Những gì tôi muốn là một chức năng, rnames nói, để làm cho danh sách bất kỳ vào một danh sách tên, chẳng hạn rằng:

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

và sau đây, đó là những gì tên() không anyway:

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

phương pháp hacky hiện tại của tôi là thêm một điều được ghi tên vào danh sách, có được tên, và sau đó chặt nó đi:

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

nhưng là có một/cách thích hợp tốt hơn để làm điều này?

Trả lời

4

Một cách tiếp cận mà cảm thấy hơi sạch hơn là gán tên vào danh sách:

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

Biến nó thành một chức năng:

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

trường hợp thử nghiệm:

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

Đóng đủ :) tên của tôi trả về tên thay vì danh sách đã đổi tên, nhưng danh sách đã đổi tên có thể hữu ích. Tôi đã hy vọng có thể chỉ có một chức năng để chuyển đổi một danh sách thành một danh sách có tên. Không thể tìm thấy một ... – Spacedman

1

Tên nằm trong một thuộc tính có tên ... tên:

> 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

Làm thế nào về một cái gì đó như thế này?

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

Nó xử lý list() và không có trường hợp tên; và nó không làm bất cứ điều gì nếu đã có tên.

Các vấn đề liên quan