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