+ - 0:00:00
Notes for current slide
Notes for next slide

Типы данных, условия, ввод и вывод

Визуализация и анализ географических данных на языке R

Тимофей Самсонов

МГУ имени Ломоносова, Географический факультет

2024-09-03

1 / 30

Типы данных

Тип данных — это класс данных, характеризуемый членами класса и операциями, которые могут быть к ним применены. С помощью типов данных мы можем представлять привычные нам сущности, такие как числа, строки и т.д. В языке R существует 5 базовых типов данных:


Название Тип данных
complex комплексные числа
character строки
integer целые числа
logical логические (булевы)
numeric числа с плавающей точкой
2 / 30

Числа

Числа — основной тип данных в R. К ним относятся числа c плавающей точкой и целые числа.

Сложение и вычитание:

2 + 3
## [1] 5
2 - 3
## [1] -1

Умножение и деление:

2 * 3
## [1] 6
5 / 3
## [1] 1.666667
3 / 30

Числа

Целочисленное деление %/%:

5 %/% 3
## [1] 1

Остаток от деления %%:

5 %% 3
## [1] 2

Возведение в степень:

2 ^ 3
## [1] 8
2 ** 3
## [1] 8
4 / 30

Переменные

Как правило, в настоящих программах числа в явном виде встречаются лишь иногда. Поскольку одно и то же число может выполнять разные функции в разных выражениях, в программе вводят переменные и присваивают им значения с помощью оператора <- либо =:

a <- 5
b = 3

Чтобы вывести значение переменной на экран, достаточно просто ввести его:

a
## [1] 5
b
## [1] 3
5 / 30

Переменные

Мы можем выполнить над переменными все те же операции что и над константами:

a + b
## [1] 8

Новую переменную можно создать на основе значений существующих переменных и констант:

d = b
e = a + d
f = e + 2.5
d
## [1] 3
e
## [1] 8
f
## [1] 10.5
6 / 30

Переменные

Противоположное по знаку число получается добавлением унарного оператора - перед константой или переменной:

f = -2
f
## [1] -2
f = -e
f
## [1] -8

Операция взятия остатка от деления бывает полезной, например, когда мы хотим выяснить, является число четным или нет:

d %% 2
## [1] 1
e %% 2
## [1] 0
7 / 30

Числовые функции

В качестве аргумента функции можно использовать переменную, константу, а также выражения:

sqrt(a)
## [1] 2.236068
tan(1.5)
## [1] 14.10142
abs(a + b - 2.5)
## [1] 5.5

Вы также можете легко вкладывать функции одна в одну, и записывать результат в переменную:

b = sqrt(sin(a) + 2)
b
## [1] 1.020331
8 / 30

Строки

Строки состоят из символов. Чтобы создать строковую переменную, необходимо заключить текст строки в кавычки:

s = "В историю трудно войти, но легко вляпаться (М.Жванецкий)"
s
## [1] "В историю трудно войти, но легко вляпаться (М.Жванецкий)"

Длину строки в символах можно узнать с помощью функции nchar()

nchar(s)
## [1] 56
9 / 30

Строки

Конкатенация — сцепление строк — выполняется с помощью функции paste():

s1 = "В историю трудно войти,"
s2 = "но легко вляпаться"
s3 = "(М.Жванецкий)"
paste(s1, s2, s3)
## [1] "В историю трудно войти, но легко вляпаться (М.Жванецкий)"

Конкатенировать можно не только строки, но и числа:

year = 1950
pop = 1850
s1 = "Максимальная численность населения в Детройте пришлась на"
s2 = "год и составила"
s3 = "тыс. чел"
paste(s1, year, s2, pop, s3)
## [1] "Максимальная численность населения в Детройте пришлась на 1950 год и составила 1850 тыс. чел"
10 / 30

Даты

Для создания даты используется функция as.Date(). В качестве аргумента функции необходимо задать дату, записанную в виде строки:

birth = as.Date('1986/02/18')
birth
## [1] "1986-02-18"

Сегодняшнюю дату вы можете узнать с помощью специальной функции Sys.Date():

current = Sys.Date()
current
## [1] "2024-09-03"
11 / 30

Даты

Вычитание дат дает интервал во времени:

current - birth
## Time difference of 14077 days

Сложение даты и интервала дает новую дату:

current + 40
## [1] "2024-10-13"
12 / 30

Логические

Логические переменные возникают там, где нужно проверить условие. Переменная логического типа может принимать значение TRUE (истина) или FALSE (ложь). Для их обозначения также возможны более компактные константы T и F соответственно.

Следующие операторы приводят к возникновению логических переменных:

  • РАВНО (==) --- проверка равенства операндов
  • НЕ РАВНО (!=) --- проверка неравенства операндов
  • МЕНЬШЕ (<) --- первый аргумент меньше второго
  • МЕНЬШЕ ИЛИ РАВНО (<=) --- первый аргумент меньше или равен второму
  • БОЛЬШЕ (>) --- первый аргумент больше второго
  • БОЛЬШЕ ИЛИ РАВНО (>=) --- первый аргумент больше или равен второму
13 / 30

Логические

Пример логических операций:

a = 1
b = 2
a == b
## [1] FALSE
a != b
## [1] TRUE
a > b
## [1] FALSE
a < b
## [1] TRUE
14 / 30

Логические

Если необходимо проверить несколько условий одновременно, их можно комбинировать с помощью логических операторов. Наиболее популярные среди них:

  • И (&&) - проверка истинности обоих условий
  • ИЛИ (||) - проверка истинности хотя бы одного из условий
  • НЕ (!) - отрицание операнда (истина меняется на ложь, ложь на истину)
c=3
(b>a) && (c>b)
## [1] TRUE
(a>b) && (c>b)
## [1] FALSE
(a>b) || (c>b)
## [1] TRUE
!(a>b)
## [1] TRUE
15 / 30

Определение типа данных

Определение типа данных осуществляется с помощью функции class():

class(1)
## [1] "numeric"
class(0.5)
## [1] "numeric"
class(1 + 2i)
## [1] "complex"
class("sample")
## [1] "character"
class(TRUE)
## [1] "logical"
class(as.Date('1986-02-18'))
## [1] "Date"
16 / 30

Преобразование типов данных

Преобразование типов данных осуществляется с помощью функций семейства as(d, type), где d — это входная переменная, а type — название типа данных, к которому эти данные надо преобразовать (см. таблицу в начале главы). Несколько примеров:

k = 1
m = as(k, "character")
m
## [1] "1"
class(m)
## [1] "character"
n = as(m, "numeric")
n
## [1] 1
class(n)
## [1] "numeric"
17 / 30

Преобразование типов данных

Для функции as() существуют обертки (wrappers), которые позволяют записывать такие преобразования более компактно и выглядят как as.<datatype>(d), где datatype --- название типа данных:

m = as.character(k)
m
## [1] "1"
class(m)
## [1] "character"
n = as.numeric(m)
n
## [1] 1
class(n)
## [1] "numeric"
d = as.Date('1986-02-18')
d
## [1] "1986-02-18"
class(d)
## [1] "Date"
18 / 30

Преобразование типов данных

Если преобразовать число c плавающей точкой до целого, то дробная часть будет отброшена:

as.integer(2.7)
## [1] 2

После преобразования типа данных к переменной будут применимы только те функции, которые определены для данного типа данных:

a = 2.5
b = as.character(a)
b + 2
## Error in b + 2: non-numeric argument to binary operator
nchar(b)
## [1] 3
19 / 30

Проверка типов данных и пустых значений

Для проверки типа данных можно использовать функции семейства is.<datatype>:

is.integer(2.7)
## [1] FALSE
is.numeric(2.7)
## [1] TRUE
is.character('Привет!')
## [1] TRUE

Особое значение имеют функции проверки пустых переменных (имеющих значение NA - not available), которые могут получаться в результате несовместимых преобразований или пропусков в данных:

as.integer('Привет!')
## [1] NA
20 / 30

Ввод данных c консоли

Для ввода данных через консоль можно воспользоваться функцией readline(), которая будет ожидать пользовательский ввод и нажатие клавиши Enter, после чего вернет введенные данные в виде строки.

Предположим, пользователь вызывает эту функцию и вводит с клавиатуры 1024:

a = readline()

Выведем результат на экран:

a
## [1] "1024"

Функция readline() всегда возвращает строку, поэтому если вы ожидаете ввод числа, полученное значение необходимо явным образом преобразовать к числовому типу

21 / 30

Вывод данных на консоль

Для вывода данных в консоль можно воспользоваться тремя способами:

  • Просто напечатать название переменной с новой строки (не работает при запуске программы командой Source)
  • Вызвать функцию print()
  • Вызвать функцию cat()
  • Заключить выражение в круглые скобки ()

Функция print() работает точно так же, как и просто название переменной с новой строки, отличаясь лишь двумя особенностями:

  • print() явным образом говорит о том, что вы хотите вывести в консоль некую информацию
  • print() работает при любых методах запуска программы, в том числе методом Source.
22 / 30

Вывод данных на консоль

a = 1024
a
## [1] 1024
print(a)
## [1] 1024
b = "Fourty winks in progress"
b
## [1] "Fourty winks in progress"
print(b)
## [1] "Fourty winks in progress"
print(paste("2 в степени 10 равно", 2^10))
## [1] "2 в степени 10 равно 1024"
print(paste("Сегодняшняя дата - ", Sys.Date()))
## [1] "Сегодняшняя дата - 2024-09-03"
23 / 30

Вывод данных на консоль

Функция cat() отличается от print() следующими особенностями:

  • cat() выводит значение переменной, и не печатает ее измерения и внешние атрибуты.
  • cat() принимает множество аргументов и может осуществлять конкатенацию строк аналогично функции paste()
  • cat() не возвращает никакого значений, в то время как print() возвращает значение, переданное ей в качестве аргумента.
  • cat() можно использовать только для атомарных типов данных. Для классов (таких как Date) она будет выводит содержимое объекта, которое может не совпадать с тем, что пользователь ожидает вывести
24 / 30

Вывод данных на консоль

cat(b)
## Fourty winks in progress
cat("2 в степени 10 равно", 2^10)
## 2 в степени 10 равно 1024
cat("Сегодняшнаяя дата -", Sys.Date())
## Сегодняшнаяя дата - 19969
25 / 30

Вывод данных на консоль

Вывод с помощью круглых скобок позволяет выводить результат выполнения выражения:

(a = rnorm(1)) # сгенерируем случайное число, запишем в переменную и выведем на экран
## [1] -0.2802329
(b = 2 * a) # переменная a доступна, ее можно использовать и далее для вычислений
## [1] -0.5604657
26 / 30

Условный оператор

Проверка условий позволяет осуществлять так называемое ветвление в программе. Ветвление означает, что при определенных условиях (значениях переменных) будет выполнен один программный код, а при других условиях — другой.

Для проверки условий используется условный оператор if --- else if --- else следующего вида:

if (condition) {
statement1
} else if (condition) {
statement2
} else {
statement3
}
27 / 30

Условный оператор

Например, сгенерируем случайное число, округлим его до одного знака после запятой и проверим относительно нуля:

(a = round(rnorm(1), 1))
## [1] -0.6
if (a < 0){
cat('Получилось отрицательное число!')
} else if (a > 0) {
cat('Получилось положительное число!')
} else {
cat('Получился нуль!')
}
## Получилось отрицательное число!
28 / 30

Условный оператор

Условия часто нужны для обработки пользовательского ввода:

cat('Введите широту вашей точки:')
phi = as.numeric(readline())

Пользователь вводит 68, мы оцениваем результат:

if (!is.na(phi)) { # проверяем, получилось ли преобразовать к числу
if (abs(phi) >= 66.562 & abs(phi) <= 90) { # выполняем проверку на заполярность
cat('Точка находится в Заполярье')
} else {
cat('Точка не находится в Заполярье')
}
} else {
cat('Необходимо ввести число!') # оповещаем о некорректном вводе
}
## Точка находится в Заполярье
29 / 30

Оператор переключения

Оператор переключения (switch) является удобен, когда надо сделать выбор на основе конечного множества значений. Например, определим столицу Федерального округа по его названию:

name = "Приволжский"
capital = switch(name,
'Центральный' = 'Москва',
'Северо-Западный' = 'Санкт-Петербург',
'Южный' = 'Ростов-на-Дону',
'Северо-Кавказский' = 'Пятигорск',
'Приволжский' = 'Нижний Новгород',
'Уральский' = 'Екатеринбург',
'Сибирский' = 'Новосибирск',
'Дальневосточный' = 'Хабаровск')
print(capital)
## [1] "Нижний Новгород"
30 / 30

Типы данных

Тип данных — это класс данных, характеризуемый членами класса и операциями, которые могут быть к ним применены. С помощью типов данных мы можем представлять привычные нам сущности, такие как числа, строки и т.д. В языке R существует 5 базовых типов данных:


Название Тип данных
complex комплексные числа
character строки
integer целые числа
logical логические (булевы)
numeric числа с плавающей точкой
2 / 30
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow