Обзор системы типов R
Разберитесь с типами double, integer, character, logical и complex.
«Обзор системы типов R» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Система типов R
В R предусмотрена богатая система типов. У каждого объекта есть класс (категория высокого уровня) и тип (режим хранения низкого уровня). Понимание обоих понятий помогает писать корректный и эффективный код и находить ошибки, связанные с типами.
# Check class and type of various objects
cat('class(42L) :', class(42L), '
')
cat('typeof(42L) :', typeof(42L), '
')
cat('class(3.14) :', class(3.14), '
')
cat('typeof(3.14) :', typeof(3.14), '
')
cat('class(TRUE) :', class(TRUE), '
')
cat('class("hello"):', class('hello'), '
')class() и typeof()
class(x) возвращает категорию высокого уровня, используемую объектно-ориентированной системой R (например, 'integer', 'numeric', 'matrix'). typeof(x) возвращает тип хранения низкого уровня в C (например, 'integer', 'double', 'closure').
m <- matrix(1:4, nrow = 2)
cat('class(matrix) :', class(m), '
') # matrix array
cat('typeof(matrix) :', typeof(m), '
') # integer
f <- factor(c('a', 'b', 'a'))
cat('class(factor) :', class(f), '
') # factor
cat('typeof(factor) :', typeof(f), '
') # integer (stored as int!)
cat('class(list) :', class(list()), '
') # list
cat('typeof(list) :', typeof(list()), '
') # listis.numeric() — проверка числового типа
is.numeric(x) возвращает TRUE как для значений integer, так и для значений double (а также для числовых матриц). Эта функция проверяет числовой супертип, а не конкретный режим хранения.
cat('is.numeric(3.14):', is.numeric(3.14), '
') # TRUE (double)
cat('is.numeric(3L): ', is.numeric(3L), '
') # TRUE (integer)
cat('is.numeric(TRUE):', is.numeric(TRUE), '
') # FALSE
cat('is.numeric("3"): ', is.numeric('3'), '
') # FALSE
cat('is.numeric(NA): ', is.numeric(NA), '
') # FALSE (NA is logical)is.integer() и is.double()
is.integer() проверяет именно хранение в формате integer (созданное с суффиксом L или с помощью as.integer()). is.double() проверяет хранение чисел с плавающей точкой в формате double. Оба типа являются подмножествами numeric.
x_int <- 5L
x_dbl <- 5.0
cat('--- x_int = 5L ---
')
cat('is.integer:', is.integer(x_int), '
') # TRUE
cat('is.double: ', is.double(x_int), '
') # FALSE
cat('is.numeric:', is.numeric(x_int), '
') # TRUE
cat('--- x_dbl = 5.0 ---
')
cat('is.integer:', is.integer(x_dbl), '
') # FALSE
cat('is.double: ', is.double(x_dbl), '
') # TRUE
cat('is.numeric:', is.numeric(x_dbl), '
') # TRUEis.character() — проверка строк
is.character(x) возвращает TRUE, если x — вектор типа character (строковый вектор). Используйте эту функцию для проверки входных данных, которые должны быть текстом, или для различения числовых и строковых типов NA.
greetings <- c('hello', 'world', 'R')
numbers <- c(1, 2, 3)
numeric_string <- '42'
cat('is.character(greetings): ', is.character(greetings), '
')
cat('is.character(numbers): ', is.character(numbers), '
')
cat('is.character(numeric_string): ', is.character(numeric_string), '
')
cat('is.character(NA_character_): ', is.character(NA_character_), '
')is.logical() — проверка логического типа
is.logical(x) возвращает TRUE, если x содержит логические (булевы) значения. Обратите внимание: нетипизированное NA по умолчанию является логическим значением.
flags <- c(TRUE, FALSE, TRUE, NA)
cat('is.logical(flags): ', is.logical(flags), '
') # TRUE
cat('is.logical(NA): ', is.logical(NA), '
') # TRUE (default NA is logical)
cat('is.logical(1): ', is.logical(1), '
') # FALSE
cat('is.logical("TRUE"):', is.logical('TRUE'), '
') # FALSE
cat('typeof(NA): ', typeof(NA), '
') # logicalИерархия типов R
Атомарные типы R образуют иерархию от простейшего к наиболее сложному: logical < integer < double < complex < character. При смешивании типов в векторе R преобразует все элементы к наиболее сложному присутствующему типу.
# Type hierarchy in action
cat('c(TRUE, 1L) type: ', typeof(c(TRUE, 1L)), '
') # integer
cat('c(1L, 1.5) type: ', typeof(c(1L, 1.5)), '
') # double
cat('c(1.5, 1+0i) type: ', typeof(c(1.5, 1+0i)), '
') # complex
cat('c(1+0i, "a") type: ', typeof(c(1+0i, 'a')), '
') # character
cat('c(TRUE, "x") type: ', typeof(c(TRUE, 'x')), '
') # characterПрограммная проверка типов
Можно написать функции для проверки типов, чтобы анализировать список объектов. Сочетание class(), typeof() и length() даёт подробное описание структуры любого объекта.
describe_type <- function(x, label) {
cat(label, ': class =', class(x), ', typeof =', typeof(x),
', length =', length(x), '
')
}
describe_type(42L, 'integer literal')
describe_type(3.14, 'double literal')
describe_type(TRUE, 'logical')
describe_type('hello', 'character')
describe_type(c(1,2,3), 'numeric vector')
describe_type(list(1,'a'), 'list')storage.mode() и mode()
storage.mode(x) похожа на typeof(x), но использует соглашение об именовании S3 (например, возвращает 'double' вместо 'double'). mode(x) возвращает немного более грубую группировку, объединяя integer и double в 'numeric'.
x_int <- 5L
x_dbl <- 5.0
cat('mode(5L): ', mode(x_int), '
') # numeric
cat('mode(5.0): ', mode(x_dbl), '
') # numeric
cat('storage.mode(5L): ', storage.mode(x_int), '
') # integer
cat('storage.mode(5.0):', storage.mode(x_dbl), '
') # double
# mode() lumps int+dbl; storage.mode() / typeof() distinguish themПроверка типов списков и таблиц данных
Для более сложных объектов, таких как списки и таблицы данных, sapply(df, class) применяет class() к каждому столбцу и возвращает именованный вектор типов столбцов — это быстрый способ проверить схему таблицы данных.
df <- data.frame(
id = 1:3,
name = c('Alice', 'Bob', 'Carol'),
score = c(88.5, 79.0, 92.3),
passed = c(TRUE, TRUE, TRUE)
)
cat('Column types:
')
print(sapply(df, class))
cat('Column typeof:
')
print(sapply(df, typeof))Краткий обзор системы типов
Краткая памятка по инструментам проверки типов в R:
class(x)— имя класса S3 высокого уровняtypeof(x)— тип хранения низкого уровня в Cis.numeric(x)— TRUE для integer или doubleis.integer(x)— TRUE только для хранения в формате integeris.double(x)— TRUE только для double (чисел с плавающей точкой)is.character(x)— TRUE для строкis.logical(x)— TRUE для TRUE/FALSE/NA
x <- 42L
cat('class(42L): ', class(x), '
')
cat('typeof(42L): ', typeof(x), '
')
cat('is.numeric(42L): ', is.numeric(x), '
')
cat('is.integer(42L): ', is.integer(x), '
')
cat('is.double(42L): ', is.double(x), '
')
cat('is.character(42L):', is.character(x), '
')Быстрая проверка
Что возвращает is.numeric(5L) в R?
Итоги: система типов R
Отличная работа! Основные выводы этого урока:
class(x)возвращает тип высокого уровня, аtypeof(x)— тип хранения низкого уровняis.numeric()возвращает TRUE и для integer, и для doubleis.integer()иis.double()различают два числовых подтипа- Иерархия типов R (от низшего к высшему): logical → integer → double → complex → character
- Смешивание типов в векторе запускает автоматическое преобразование к типу самого высокого уровня
sapply(df, class)проверяет типы всех столбцов таблицы данных
# Type audit function
audit_types <- function(x, name = 'x') {
cat(name, ': class=', class(x), ', typeof=', typeof(x),
', is.numeric=', is.numeric(x), '
')
}
audit_types(1L, 'integer')
audit_types(1.0, 'double')
audit_types(TRUE, 'logical')
audit_types('hello', 'character')
audit_types(1+2i, 'complex')Часто задаваемые вопросы
Урок «Обзор системы типов R» бесплатный?
Да — полный текст урока «Обзор системы типов R» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обзор системы типов R»?
Разберитесь с типами double, integer, character, logical и complex. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Обзор системы типов R»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обзор системы типов R
- Преобразование числовых типов
- Преобразование логических и строковых значений
- Подводные камни и лучшие практики приведения типов