为何R语言中names(x)返回NULL但colnames(x)却非空?
关于R中
names()函数的疑问与探索 从文档?names可知:
names(x)
...
x 一个R对象。
...
(若对象无名称,包括无法拥有名称的对象类型,则返回NULL。)
但看以下示例:
tbl <- table(data.frame(x=c(1, 2), y=c(3, 4))) names(tbl) # NULL colnames(tbl) # [1] "3" "4"
我认为这与文档描述不符,还是我有所遗漏?
文档还提到“默认方法用于获取和设置向量(包括列表)或配对列表的"names"属性。”
那对于data.frame,它要么返回错误,要么返回正确的列名和/或行名,或者两者都返回?
我的思路如下:
x <- c(1:3) names(x) <- letters[1:3] df <- data.frame(x=c(1, 2), y=c(3, 4)) tbl <- table(df) mynames <- function(x) { # 不能使用names(x),因为names(x)会调用.Primitive("names") UseMethod("mynames") } mynames.integer <- function(x) { return(names(x)) } mynames.table <- function(x) { if (is.null(names(x))) { r <- list(colnames = colnames(x), rownames = rownames(x)) } else { r <- list(names = names(x), colnames = colnames(x), rownames = rownames(x)) } return(r) } mynames.data.frame <- function(x) { return(list(colnames = colnames(x), rownames = rownames(x))) } mynames(x) # [1] "a" "b" "c" mynames(df) # $colnames # [1] "3" "4" # $rownames # [1] "1" "2" mynames(tbl) # $colnames # [1] "3" "4" # $rownames # [1] "1" "2" names(tbl) <- letters[1:4] mynames(tbl) # $names # [1] "a" "b" "c" "d" # $colnames # [1] "3" "4" # $rownames # [1] "1" "2"
但查看:
attributes(tbl) # $dim # [1] 2 2 # $dimnames # $dimnames$x # [1] "1" "2" # $dimnames$y # [1] "3" "4" # $class # [1] "table"
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

