Вектор — структура данных для совместного хранения объектов одного и того же типа (про типы дальше).

Создание векторов

Можно задать с помощью функции конкатенации “с”:

c(1, 2, 3, 4)
## [1] 1 2 3 4

А так задается вектор из последовательных целых чисел:

1:4
## [1] 1 2 3 4

Еще немного про конкатенацию:

c(1, 2, c(c(2.6, 10), 20, 1), 3)
## [1]  1.0  2.0  2.6 10.0 20.0  1.0  3.0

Векторы есть. А где скаляры?

А их нет. Есть векторы длины 1.

1
## [1] 1
c(1)
## [1] 1

Так и живем.

https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Vectors

Типы (atomic) векторов

Numeric vector (может быть integer, double или complex):

x <- c(1, 2, 2.6)

Character vector:

x <- c("a", "b", "c")

Logical vector:

x <- c(TRUE, TRUE, FALSE)

Есть еще векторы типа raw, но ну их…

Какого типа будет вектор?

c(1, 2, 2.6, "a", FALSE)
## [1] "1"     "2"     "2.6"   "a"     "FALSE"
c(1, 2, TRUE, FALSE)
## [1] 1 2 1 0

Как проверить тип вектора?

typeof(c(1, 2, "3"))
## [1] "character"
is.numeric(c(1, 2, "3"))
## [1] FALSE

?is.integer, ?is.double, ?is.logical, ?is.complex, ?is.raw

Как изменить тип вектора?

as.numeric(c("1", "2", "3"))
## [1] 1 2 3

?as.integer, ?as.double, ?as.logical, ?as.complex, ?as.raw

Забавный факт

typeof(c(1, 2, 3))
## [1] "double"
typeof(1:3)
## [1] "integer"

Длинные векторы в консоли

1:100
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
##  [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100

Функция seq

seq(1, 50, 2)
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
seq(0, 1, 0.13)
## [1] 0.00 0.13 0.26 0.39 0.52 0.65 0.78 0.91

Длина вектора

x <- 1:42
length(x)
## [1] 42

Получение доступа к элементам вектора

x <- c(1, 6, 2, 4, 3, 1)
x[3]
## [1] 2
x[c(2, 3, 4, 4)]
## [1] 6 2 4 4

Арифметика с векторами

x <- c(1 , 2 , 3 , 4)
2 * x
## [1] 2 4 6 8

Все стандартные функции работают с векторами, например:

sqrt(x)
## [1] 1.000000 1.414214 1.732051 2.000000

Результат работы — вектор той же длины, что и x.

Для векторов одинаковой длины операции +, -, *, /, %%, %/% происходят поэлементно:

x <- c(1, 2, 3, 4)
y <- c(5, 6, 7, 8)
x + y
## [1]  6  8 10 12
y %/% x
## [1] 5 3 2 2

В степень возводятся все элементы:

x^2
## [1]  1  4  9 16

Векторы, правило переписывания

А что будет, если сложить векторы разной длины?

x <- c(2, 4, 6, 6)
y <- c(1, 2)
x - y
## [1] 1 2 5 4
x <- c(2, 4, 6, 6)
y <- c(1, 2, 3)
x - y
## Warning in x - y: longer object length is not a multiple of shorter object
## length
## [1] 1 2 3 5

Сравнение векторов

Сравнение векторов происходит поэлементно:

x <- c(1, 2, 3, 4, 5)
y <- c(2, 2, 1, 6, 5)
x < y
## [1]  TRUE FALSE FALSE  TRUE FALSE

Результат сравнения — boolean vector.

Операторы сравнения: <, <=, ==, >=, >, !=

Некоторые функции для работы с векторами

Максимальный элемент вектора:

x <- c(3, 5, 1, 6, 8, 3, 3)
max(x)
## [1] 8

Номер максимального элемента:

which.max(x)
## [1] 5

Еще, конечно, есть min, which.min.

Номера элементов, удовлетворяющих условию:

x <- c(3, 5, 1, 6, 8, 3, 3)
which(x > 3)
## [1] 2 4 5

Сумма элементов вектора:

x <- c (4, 5, 3)
sum(x)
## [1] 12

Произведение элементов:

prod(x)
## [1] 60

Сортировка векторов

x <- c(6, 10, 20, 11, 2.23, 0.21)
sort(x)
## [1]  0.21  2.23  6.00 10.00 11.00 20.00
sort (x , decreasing = TRUE)
## [1] 20.00 11.00 10.00  6.00  2.23  0.21

Reverse векторов

x <- c(6, 10, 20, 11, 2.23, 0.21)
rev(x)
## [1]  0.21  2.23 11.00 20.00 10.00  6.00

Два слова про картинки

x <- seq(0, 10, 0.01)
y <- sqrt(x)
plot(x, y)

Задание 1

На промежутке \([0,2\pi]\) задана функция

\(f(x) = e^{0.01 x} \sin(x)\)

На промежутке \([10\pi, 20\pi]\) задано ее симметричное отражение относительно прямой \(x = 10\pi\).

Задача: нарисовать эту функцию, найти ее глобальные максимумы (примерные) на промежутке \([0, 20\pi]\) и отметить их на рисунке вертикальными красными линиями.

Подсказка: ?abline, чтобы узнать о рисовании линий поверх имеющегося графика; col = “red”’ — дополнительный параметр для изменения цвета на красный.

Возможное решение

x.1 <- seq(0, 10 * pi, 0.01)
x.2 <- seq(10 * pi, 20 * pi, 0.01)
tmp <- exp(x.1 * 1e-2) * sin(x.1)
x <- c(x.1, x.2)
y <- c(tmp, rev(tmp))
plot(x, y)
abline(v = x[which(y == max(y))] , col = "red")

Отступление про типы объектов в R

В целом все объекты в R - это C’шные struct’ы.

https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Objects

http://adv-r.had.co.nz/C-interface.html

Сколько занимает в памяти “скаляр”? А сколько вектор?

object.size(1)
## 56 bytes

Ничего себе занимает, да?

object.size(c(1))
## 56 bytes

Ну да, это же вектор длины 1. А значит, что помимо, собственно, нашего int’а в нем хранится также информация о длине вектора, его типе и всякая другая мешура типа количества ссылок на этот объект.

object.size(c(1,3))
## 64 bytes

При этом вектор длины 2 занимает всего на 8 байт больше, чем вектор длины 1…

object.size(1.1:100.1)
## 848 bytes

Вектор длины 100 занимает 8*100 + 48 байт

object.size(1:100)
## 448 bytes

Хм, а integer vector занимают меньше…

.Machine$integer.max
## [1] 2147483647

Ну, теперь понятно :( В R исспользуются 32хбитные int’ы