You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:35:18