Типы и классы переменных

Два вопроса R:

  • В чем разница между типом (возвращаемым typeof) и классом (возвращаемым class) переменной? Разница подобна той, что, например, на языке С++?
  • Каковы возможные типы и классы переменных?

Ответ 1

В 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 связаны для каждого типа.

Ответ 2

type действительно относится к различным структурам данных, доступным в R. Это обсуждение в R Language Definition manual может помочь вам начать работу объектов и типов.

С другой стороны, class означает что-то еще в R, чем то, что вы можете ожидать. Из R Language Definition руководство (которое поставляется с вашей версией R):

2.2.4 Классы

R имеет сложную систему классов 1 в основном управляемую атрибутом класса. Этот атрибут представляет собой вектор символов, содержащий список классов, наследуемых объектом. Это составляет основу функциональности "общих методов" в R.

Этот атрибут можно получить и управлять практически без ограничений пользователями. Нет проверки того, что объект фактически содержит компоненты, которые ожидают методы класса. Таким образом, изменение атрибута класса должно выполняться с осторожностью, и когда они доступны, предпочтение отдается конкретным функциям создания и принуждения.