获取列表元素名称的一致向量

Spa*_*man 8 r

没有名称的列表的名称返回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)

但有没有更好/正确的方法来做到这一点?

And*_*rie 5

感觉稍微清晰的方法是为列表指定名称:

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)