没有名称的列表的名称返回NULL:
> names(list(1,2,3))
NULL
Run Code Online (Sandbox Code Playgroud)
但添加一个命名的东西,突然名称具有列表的长度:
> names(list(1,2,3,a=4))
[1] "" "" "" "a"
Run Code Online (Sandbox Code Playgroud)
因为这是一个命名列表.我想要的是一个函数,rnames说,将任何列表放入命名列表,这样:
rnames(list(1,2,3)) == c("","","")
identical(rnames(list()), character(0))
length(rnames(foo)) == length(foo) # for all foo
Run Code Online (Sandbox Code Playgroud)
和以下,这是姓名()所做的事情:
rnames(list(1,2,3,a=3)) == c("","","","a")
rnames(list(a=1,b=1)) == c("a","b")
Run Code Online (Sandbox Code Playgroud)
我目前的hacky方法是在列表中添加一个命名的东西,获取名称,然后将其删除:
rnames = function(l){names(c(monkey=1,l))[-1]}
Run Code Online (Sandbox Code Playgroud)
但有没有更好/正确的方法来做到这一点?
感觉稍微清晰的方法是为列表指定名称:
x <- list(1,2,3)
names(x) <- rep("", length(x))
names(x)
[1] "" "" ""
Run Code Online (Sandbox Code Playgroud)
把它变成一个函数:
rnames <- function(x){
if(is.null(names(x))) names(x) <- rep("", length(x))
return(x)
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
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"
Run Code Online (Sandbox Code Playgroud)