Почему `row.names` предпочитается над` rownames`?

В основной библиотеке R есть две функции.

  • row.names Получить и установить имена строк для фреймов данных
  • rownames Извлеките или задайте имена строк объекта, подобного матрице.

Однако docs для row.names указывает для фрейма данных, 'rownames и' colnames в конечном итоге ссылаются на имена row.names и ', соответственно, но последние являются предпочтительными. Почему предпочтительнее row.names? Было бы проще просто игнорировать row.names и просто вызвать rownames?

Ответы

Ответ 1

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), потому что для этого класса объекта нет более конкретного метода.