1) Ширина не обязательно должна быть в функции. Впоследствии его можно добавить:
rollapply(a$v, a$w, sum, partial = TRUE) + a$w
## [1] 5 3 12 25 13 49 24 19 10 22
Укажите align=
, если вы хотите другое выравнивание.
2) Этот подход немного уродлив, но другой способ для поддержки внешнего индекса.
i <- 0
rollapply(a$v, a$w, function(x) sum(x) + a$w[i <<- i+1], partial = TRUE)
## [1] 5 3 12 25 13 49 24 19 10 22
2a) Это можно немного убрать за счет дополнительного кода, использующего объектно-ориентированные идеи для поддержания состояния. Здесь мы определяем объект прото p
, имеющий внутренний счетчик и метод incr
, который увеличивает и возвращает его каждый раз, когда incr
вызывается для объекта.
library(proto)
p <- proto(counter = 0, incr = function(.) .$counter <- .$counter + 1)
rollapply(a$v, a$w, function(x) sum(x) + a$w[p$incr()], partial = TRUE)
## [1] 5 3 12 25 13 49 24 19 10 22
3) Пример в вопросе использовал выравнивание по центру, но если вам действительно нужно выравнивание по правому или левому краю, то это можно сделать, выполнив итерацию по a
, а не по a$v
. Вот это для правильного выравнивания.
Sum <- function(x) {
x <- matrix(x,,2)
v <- x[, 1]
w <- tail(x[, 2], 1)
sum(v) + w
}
rollapplyr(a, a$w, Sum, partial = TRUE, by.column = FALSE)
## [1] 3 3 9 15 11 28 21 17 10 30
# double check
rollapplyr(a$v, a$w, sum, partial = TRUE) + a$w
## [1] 3 3 9 15 11 28 21 17 10 30