dput 的 row.names 与 rownames() 返回的不一致。为什么?

dput's row.names are inconsistent with the ones returned from rownames(). Why?

(添加了可重现的示例)。考虑以下示例:

df <- as.data.frame(matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3))
#   V1 V2 V3
# 1  1  3 12
# 2  2 11 13
rownames(df) # "1" "2"
dput(df)
# structure(list(V1 = c(1, 2), V2 = c(3, 11), V3 = c(12, 13)), .Names = c("V1", 
# "V2", "V3"), row.names = c(NA, -2L), class = "data.frame")

dputrow.names(即NA-2L)与rownames()返回的不一致(即1, 2).为什么?

PS1: 有人可以添加 dput 标签吗,我没有足够的声望来做(即 1500 分)?

PS2: What's the difference between row.names() and attributes$row.names?也有类似的问题。在 link、row.names$row.names(均带点)中使用。然而,在这个问题中,出现了 rownamesrow.names (无点和带点)。也就是说,给定的 link 很有帮助,可以极大地解决问题。

row.names() 为您或您的程序提供阅读和理解的内容(以一致且因此可预测的格式)。

然而,dput()attributes() 的格式给出 row.names= 以理解从 structure() 收到它,并且它与行名称的内部方式有关存储在数据框中。 c(NA, -xL) 表示它们是从 1 到 x 自动生成的名称。

row.names()dput() 之间有一些有趣的变化:

df1 <- data.frame(list(a = 1:3, b = 3:1))
row.names(df1) # "1" "2" "3"
dput(df1) #  row.names=c(NA, -3L)

df2 <- df1[-2,]
row.names(df2) # "1" "3"
dput(df2) # row.names=c(1L, 3L)

df2 <- df1[-1,]
row.names(df2) # "2" "3"
dput(df2) # row.names=2:3

row.names(df1) <- 3:1
row.names(df1) # "3" "2" "1"
dput(df1) # row.names=c(3L,2L,1L)

row.names(df1) <- as.numeric(c(2,3,4))
row.names(df1) # "2" "3" "4"
dput(df1) # row.names=c("2","3","4"))

只有在最后一次测试中它们才相同,而且有趣的是,即使是一个数值向量又被强制为数值,return 它们都是字符向量。由于某种原因 dput() 没有选择 2:4,但它在第三次测试中选择了 2:3