Ответ очевиден, если прочитать справку для ?row.names()
и ?rownames()
.
Функция rownames()
знает только что-то о матрицеподобных объектах, и CUB
не являетсяследовательно, у него нет имен строк, которые rownames()
может найти:
> rownames(CUB)
NULL
row.names()
отличается, это универсальная функция S3, и это означает, что авторы пакетов могут писать методы для определенных типов объектовтак что имена строк этих объектов могут быть извлечены.
Вот список методов, доступных для row.names()
в моем текущем сеансе, с загруженным пакетом sp
:
> methods(row.names)
[1] row.names.data.frame
[2] row.names.default
[3] row.names.SpatialGrid*
[4] row.names.SpatialGridDataFrame*
[5] row.names.SpatialLines*
[6] row.names.SpatialLinesDataFrame*
[7] row.names.SpatialPixels*
[8] row.names.SpatialPoints*
[9] row.names.SpatialPointsDataFrame*
[10] row.names.SpatialPolygons*
[11] row.names.SpatialPolygonsDataFrame*
Non-visible functions are asterisked
Класс объекта CUB
:
> class(CUB)
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
Так что происходит, что используется метод SpatialPolygonsDataFrame
функции row.names()
, и он знает, где найти нужную строкуимена.