Два вопроса R:
- В чем разница между типом (возвращаемым
typeof
) и классом (возвращаемымclass
) переменной? Разница подобна той, что, например, на языке С++? - Каковы возможные типы и классы переменных?
Два вопроса R:
typeof
) и классом (возвращаемым class
) переменной? Разница подобна той, что, например, на языке С++?В R каждый "объект" имеет 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
Функция mode предоставляет информацию о режиме объекта в смысле Becker, Chambers и Wilks (1988) и более совместима с другими реализациями языка S
Ссылка, которую я опубликовал выше, также содержит список всех собственных R basic types
(векторов, списков и т.д.) и всех compound objects
(факторов и data.frames), а также некоторые примеры того, как mode
, typeof
и class
связаны для каждого типа.
type
действительно относится к различным структурам данных, доступным в R. Это обсуждение в R Language Definition manual может помочь вам начать работу объектов и типов.
С другой стороны, class
означает что-то еще в R, чем то, что вы можете ожидать. Из
R Language Definition руководство (которое поставляется с вашей версией R):
2.2.4 Классы
R имеет сложную систему классов 1 в основном управляемую атрибутом класса. Этот атрибут представляет собой вектор символов, содержащий список классов, наследуемых объектом. Это составляет основу функциональности "общих методов" в R.
Этот атрибут можно получить и управлять практически без ограничений пользователями. Нет проверки того, что объект фактически содержит компоненты, которые ожидают методы класса. Таким образом, изменение атрибута класса должно выполняться с осторожностью, и когда они доступны, предпочтение отдается конкретным функциям создания и принуждения.