在FUN中使用rollapply width参数会产生意外结果

在FUN中使用rollapply width参数会产生意外结果,r,xts,rollapply,R,Xts,Rollapply,我使用了rollapply进行计算,将滚动中的最后一个值除以平均值减1,这很好,您可以自己尝试: set.seed(123) v <- xts(rnorm(5, 5, 1), Sys.Date()-5:1) rollapplyr(v, width = 3, function(x) x[3, ] / mean(x) - 1) [,1] 2019-01-12 NA 2019-01-13 NA 2019-01-14 0.

我使用了
rollapply
进行计算,将滚动中的最后一个值除以平均值减1,这很好,您可以自己尝试:

set.seed(123)
v <- xts(rnorm(5, 5, 1), Sys.Date()-5:1)
rollapplyr(v, width = 3, function(x) x[3, ] / mean(x) - 1)

                  [,1]
2019-01-12          NA
2019-01-13          NA
2019-01-14  0.24784729
2019-01-15 -0.07241364
2019-01-16 -0.08178780
为了更灵活,我尝试将width参数直接传递到函数中,得到了我没有预料到的结果,尽管第四列是正确的:

rollapplyr(v, width = 4, function(x, width) x[width, ] / mean(x) - 1)

                 [,1]        [,2]        [,3]        [,4]
2019-01-12         NA          NA          NA          NA
2019-01-13         NA          NA          NA          NA
2019-01-14         NA          NA          NA          NA
2019-01-15 -0.1478253 -0.08442393  0.25895593 -0.02670674
2019-01-16 -0.1137588  0.21861923 -0.05789086 -0.04696956

有人知道在FUN中使用width参数在概念上有什么错误吗?如何解释输出?有人知道如何正确操作吗?

您得到的结果等于这一行的结果:

rollapplyr(v, width = 4, function(x) x / mean(x) - 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)))
在这里,w是在更高的环境级别上定义的,并且在
rollappy
中创建并随后在
sapply


关于环境的更多信息可以在高级R书中找到。

我想我可以做
函数(v,w){rollappyr(v,width=w,function(x)x[w,]/mean(x)-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)))
function(v,w) {
  rollapplyr(v, 
             width = w, 
             function(x) x[w, ] / mean(x) - 1)
}