Результат, который вы получите, равен результату из этой строки:
rollapplyr(v, width = 4, function(x) x / mean(x) - 1)
Что происходит внутри, когда у вас есть только 1 столбец, так это то, что вы получаете строки кода ниже и некоторые переменные, которые установлены. Результат установки переменных уже сделан в коде. Функция rollapply
немного сложнее.
width <- 4
ind <- as.matrix(seq.int(4, 5))
# FUN passed on from rollappy
FUN <- match.fun(function(x, width) x[width, ] / mean(x) - 1)
sapply(ind, function(i) FUN(.subset_xts(v,
(i - width + 1):i)))
После этих строк кода происходит сборка возвращаемого xts.
Но как только вы начнете отлаживать то, что происходит в части sapply
, (отладка FUN) вы увидите, что width
не передается из вызова sapply
функции (i) и, следовательно, недоступен когда весело. Только в тех случаях, когда ширина определена внутри rollapply, ширина доступна для функции .subset. То же самое происходит, если вы запускаете вышеуказанные строки кода. Это результат среды, в которой была определена переменная ширины и в которой выполняется FUN. Они разные, что приводит к полученным результатам.
Лучший способ продвинуться вперед - это обернуть объект в другую функцию, как вы упоминали в своем комментарии:
function(v,w) {
rollapplyr(v,
width = w,
function(x) x[w, ] / mean(x) - 1)
}
Здесь w определяется на более высоком уровне среды и корректно передается при создании FUN внутри rollapply
, который затем выполняется в sapply
.
Более подробную информацию об окружающей среде вы можете найти здесь в расширенной книге R.