Функция
x <- 1:10
dimension <- 3
embed
написана на самом R, вы можете просмотреть ее исходный код, набрав embed
в консоли. Основная часть кода для этого случая следующая
n <- length(x)
m <- n - dimension + 1L
data <- x[1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L]
dim(data) <- c(m, dimension)
, поэтому n
становится 10, m равно n - dimension + 1L
, что здесь 8. Следующая строка - самая важная. Мы генерируем индексы для подмножества x
, используя команду rep.int
.
1L:m #is
#[1] 1 2 3 4 5 6 7 8
Мы повторяем m
, dimension
раз, что в этом случае
rep.int(m, dimension)
#[1] 8 8 8
dimension:1L #is
#[1] 3 2 1
Теперь каждое значение dimension:1L
повторяется rep.int(m, dimension)
раз, что дает
rep.int(dimension:1L, rep.int(m, dimension))
#[1] 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1
и мы вычитаем 1 из этих чисел, возвращая
rep.int(dimension:1L, rep.int(m, dimension)) - 1L
#[1] 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
Теперь приведенная выше последовательность добавляется к 1L:m
с использованием техники переработки, поэтому вы получаете
1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L
#[1] 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
выше указатель на поднабор значений из x
, так как в этом случае наш x
равен 1:10
, он будет возвращать те же значения.
x[1L:m + rep.int(dimension:1L, rep.int(m, dimension)) - 1L]
#[1] 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
Наконец, все эти числа расположены в виде матрицы с m
строками и dimension
столбцами.
dim(data) <- c(m, dimension)
data
# [,1] [,2] [,3]
#[1,] 3 2 1
#[2,] 4 3 2
#[3,] 5 4 3
#[4,] 6 5 4
#[5,] 7 6 5
#[6,] 8 7 6
#[7,] 9 8 7
#[8,] 10 9 8