R核心库中有两个功能 .
row.names获取并设置数据框的行名称
rownames检索或设置类矩阵对象的行名称 .
但是 row.names 的文档指定对于数据框,'rownames'和'colnames'最终分别调用'row.names'和'names',但后者是首选 . 为什么 row.names 首选?忽略 row.names 并且只是调用 rownames 会不会更容易?
row.names
rownames
row.names() 是S3泛型函数,而 rownames() 是较低级别的非泛型函数 . rownames() 实际上是 row.names() 的默认方法,在没有更具体的方法的情况下应用于任何对象 .
row.names()
rownames()
如果您正在操作数据框 x ,那么使用 row.names(x) 会更有效,因为数据帧有一个特定的 row.names() 方法 . 数据框的 row.names() 方法只提取已存储在 x 中的 "row.names" 属性 . 相比之下,由于 rownames() 的定义以及函数之间的相互关系, rownames(x) 必须提取 x 的所有维名称,然后删除列名,然后与 names(x) 结合,然后再次删除 names(x) . 此过程甚至涉及调用 row.names(x) 作为中间步骤 . 这通常会很快发生,你没有注意到它,但只是提取属性显然更有效 .
x
row.names(x)
"row.names"
rownames(x)
names(x)
如果您不想打扰区分这两个函数,那么始终只使用通用版本 row.names() 是合乎逻辑的,因为它总是调度适当的方法 . 例如,如果 x 是一个矩阵,那么 row.names(x) 只是干净地传递到 rownames(x) ,因为该类对象没有更具体的方法 .
1 回答
row.names()
是S3泛型函数,而rownames()
是较低级别的非泛型函数 .rownames()
实际上是row.names()
的默认方法,在没有更具体的方法的情况下应用于任何对象 .如果您正在操作数据框
x
,那么使用row.names(x)
会更有效,因为数据帧有一个特定的row.names()
方法 . 数据框的row.names()
方法只提取已存储在x
中的"row.names"
属性 . 相比之下,由于rownames()
的定义以及函数之间的相互关系,rownames(x)
必须提取x
的所有维名称,然后删除列名,然后与names(x)
结合,然后再次删除names(x)
. 此过程甚至涉及调用row.names(x)
作为中间步骤 . 这通常会很快发生,你没有注意到它,但只是提取属性显然更有效 .如果您不想打扰区分这两个函数,那么始终只使用通用版本
row.names()
是合乎逻辑的,因为它总是调度适当的方法 . 例如,如果x
是一个矩阵,那么row.names(x)
只是干净地传递到rownames(x)
,因为该类对象没有更具体的方法 .