Вектор — структура данных для совместного хранения объектов одного и того же типа (про типы дальше).
Можно задать с помощью функции конкатенации “с”:
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
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(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
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)
На промежутке \([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 - это C’шные struct’ы.
https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Objects
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’ы