为什么`row.names`优于`rownames`?

时间:2016-07-19 18:47:18

标签: r

R核心库中有两个函数。

  • row.names 获取并设置数据框的行名称
  • rownames 检索或设置类似矩阵的对象的行名称。

然而row.names的文档指定对于数据框,'rownames'和'colnames'最终分别调用'row.names'和'names',但后者是首选。为什么row.names是首选的?如果忽略row.names而只是致电rownames,会不会更容易?

1 个答案:

答案 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),因为该类对象没有更具体的方法。