Так что, похоже, вам нужно определить две функции, скажем, «vdiff» и «vpatch» (в R уже есть функция «diff», поэтому лучше всего придумать «векторный diff»).
Функция "vdiff" будет анализировать два вектора и выводить множество замен.Каждая замена будет выглядеть как «заменить диапазон r
из x
на b
», поэтому два целых числа (от / длина) обозначают диапазон r
и байтовый вектор b
.Это охватывает три случая:
- Удалить раздел из
x
(b
пусто) - Вставить раздел (длина
r
равна 0
) - Заменить секцию (длина
r
положительна, а b
не пуста).
Каждая замена может быть представлена как list(from=6, length=2, bytes=11:14)
и сгруппированы вместе всписок.
Функция vpatch
будет принимать кучу замен и применять их к x
для воссоздания y
.
Теперь функция vdiff
сложна, и янет времени, чтобы реализовать это.В приведенном ниже примере я жестко запрограммировал его, чтобы он возвращал правильный объект diff для указанных x
и y
.
... Я оставляю это как «упражнение для читателя», чтобыреализовать полностью; -)
Функция vpatch
, однако, завершена:
# Dummy hard-coded function
vdiff <- function(x,y) {
list( list(from=1, length=0, bytes=as.raw(101:103)),
list(from=7, length=3, bytes=raw()),
list(from=11, length=0, bytes=as.raw(111:113)) )
}
vpatch <- function(x,d) {
for (r in d) {
pre <- if (r$from == 1) raw(0) else x[1:(r$from-1)]
post <- if (r$from > length(x)) raw(0) else x[(r$from+r$length):length(x)]
x <- c(pre, r$bytes, post)
}
x
}
# Sample vectors
x <- as.raw(1:10)
y <- as.raw(c(101:103, 1:3, 7:10, 111:113))
d <- vdiff(x,y) # Create diff from x to y
y2 <- vpatch(x, d) # Apply diff to x to get y
identical(y, y2) # TRUE