没有名称的列表为其名称返回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
和以下,无论如何都是names()所做的:
rnames(list(1,2,3,a=3)) == c("","","","a")
rnames(list(a=1,b=1)) == c("a","b")
我目前的hacky方法是在列表中添加一个命名的东西,获取名称,然后将其删除:
rnames = function(l){names(c(monkey=1,l))[-1]}
但有更好/正确的方法吗?
答案 0 :(得分:5)
感觉稍微清晰的方法是为列表指定名称:
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"
答案 1 :(得分:2)
这样的事情怎么样?
rnames <- function(x) {
if(is.null(names(x)))
character(length(x))
else
names(x)
}
它处理list()
而没有名称案件;如果已有名字,它就不会做任何事情。
答案 2 :(得分:1)
名称位于名为... names:
的属性中> 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] "" ""