Два вопроса R:
- В чем разница между типом (возвращенным
typeof
) и классом (возвращаемымclass
) переменной? Похожа ли разница на разницу, скажем, на языке C ++? - Какие бывают типы и классы переменных?
Два вопроса R:
typeof
) и классом (возвращаемым class
) переменной? Похожа ли разница на разницу, скажем, на языке C ++?Ответы:
В R каждый «объект» имеет a mode
и a class
. Первый представляет, как объект хранится в памяти (числовой, символьный, список и функция), а второй представляет его абстрактный тип. Например:
d <- data.frame(V1=c(1,2))
class(d)
# [1] "data.frame"
mode(d)
# [1] "list"
typeof(d)
# list
Как вы можете видеть, фреймы данных хранятся в памяти как list
обёрнутые в data.frame
объекты. Последний позволяет использовать функции-члены, а также функции перегрузки, например, print
с настраиваемым поведением.
typeof
( storage.mode
) обычно дает ту же информацию, mode
но не всегда. Дело в точке:
typeof(c(1,2))
# [1] "double"
mode(c(1,2))
# [1] "numeric"
Причину этого можно найти здесь :
Специальная функция R typeof возвращает тип объекта R
Функциональный режим дает информацию о режиме объекта в смысле Беккера, Чемберса и Уилкса (1988) и более совместим с другими реализациями языка S.
Ссылка , которую я отправил выше , также содержит список всех нативного R basic types
(векторы, списки и т.д.) и все compound objects
(факторы и data.frames), а также некоторые примеры того , как mode
, typeof
и class
связаны для каждого типа.
oldClass(matrix(1:10, 2,5)) # NULL
type
на самом деле относится к различным структурам данных, доступным в R. Это обсуждение в руководстве R Language Definition может помочь вам начать работу с объектами и типами.
С другой стороны, class
в R означает нечто иное, чем то, что вы могли ожидать. Из руководства по определению языка R (которое прилагается к вашей версии R):
2.2.4 Классы
В R есть продуманная система классов 1 , управляемая главным образом через атрибут class. Этот атрибут представляет собой вектор символов, содержащий список классов, от которых наследуется объект. Это составляет основу функциональности «универсальных методов» в R.
Доступ к этому атрибуту и управление им могут осуществляться практически без ограничений со стороны пользователей. Не проверяется, действительно ли объект содержит компоненты, ожидаемые методами класса. Таким образом, изменение атрибута класса должно выполняться с осторожностью, и когда они доступны, предпочтение следует отдавать конкретным функциям создания и принуждения.