1

我正在使用 xts 并循环加载 100 到 1000 个文件。每个文件在 50k 到 300k 行之间。我在 Windows 7 64 位上使用最新版本的 R 2.15.1。我在带有 R 版本 2.14.X 的 Ubuntu Linux 上遇到了同样的问题。

下面的代码会定期使 R 崩溃:

library(xts)
N <- 1e6
for(i in 1:1000) {
  allTimes <- Sys.time()-N:1
  x <- NULL
  x <- xts(,allTimes)
  sampTimes <- allTimes[seq(1,length(allTimes),by=2)]
  y <- merge(xts(seq_along(sampTimes), sampTimes), allTimes)
  y <- na.locf(y)
  y <- to.period(y, 'seconds', 10)
  index(y) <- index(to.period(x, 'seconds', 10))
}
4

1 回答 1

4

这是在 R-devel 上回答的。问题是调用to.period零宽度 xts 对象将返回随机内存位置的 OHLC 数据。例如:

library(xts)
x <- xts(,Sys.time()-10:1)
y <- to.period(x)
y
#                           x.Open       x.High         x.Low       x.Close
# 2012-07-23 15:47:30 4.25426e-314 2.36246e-300 1.428936e-316 1.428936e-316

由于聚合“无数据”没有意义,我已经修补to.period以在零宽度/长度对象上运行时抛出错误(R-Forge 上的修订版 690)。

无需to.period在零宽度对象上运行,只需创建一个充满 1 的临时 xts 对象并to.period在其上运行。这将适用于当前在 CRAN 上的 xts。

library(xts)
N <- 1e6
for(i in 1:100) {
  allTimes <- Sys.time()-N:1
  x <- NULL
  x <- xts(,allTimes)
  sampTimes <- allTimes[seq(1,length(allTimes),by=2)]
  y <- merge(xts(seq_along(sampTimes), sampTimes), allTimes)
  y <- na.locf(y)
  y <- to.period(y, 'seconds', 10)
  tmp <- xts(rep(1,length(allTimes)), allTimes)
  index(y) <- index(to.period(tmp, 'seconds', 10))
}
于 2012-07-23T20:47:35.033 回答