1

我正在使用长格式的 data.table 中的几个时间序列及其特征,我想利用该语法构造几种不同类型的xts 对象。data.table这是我的想法:

一些初步数据

library(data.table)
set.seed(1)
DT <- data.table(
  dat = as.Date("2013-01-01") + rep(1:5, 2),
  a = c(1, -1),
  x = i <- rnorm(10),
  y = 2 * i + rnorm(10),
  z = 3 * i + rnorm(10))

让(尝试)构建 3 个不同的时间序列

DT[a == 1,{
  x.ts <- xts(x, order.by = dat)
  y.ts <- xts(y, order.by = dat)
  }]
DT[
  , list(sz = mead(z/x)), by = dat][   # operate on columns of the datatable
  , z.ts <- xts(sz, order.by = dat)]    # construct xts

这段代码有两个问题:

  1. 它打印到屏幕y.tsz.ts
  2. 对象仅在j环境中而不是在全局环境中创建。

为了解决(2),可以命名全局环境中的对象并使用<<-

x.ts <- y.ts <- z.ts <- NA
DT[a == 1,{
  x.ts <<- xts(x, order.by = dat)
  y.ts <<- xts(y, order.by = dat)
  }
]
DT[
  , list(sz = mean(z/x)), by = dat][
  , z.ts <<- xts(sz, order.by = dat)]

确实

> z.ts
               [,1]
2013-01-02 2.300730
2013-01-03 4.969685
2013-01-04 1.959377
2013-01-05 1.961270
2013-01-06 3.256254

如何在数据表中使这种类型的分配保持沉默?这是<<-合理的使用还是有更好的方法?

4

1 回答 1

2

<<-是合理的,如果有些不透明。

无论您在 中做什么j,除非您正在使用:=,如果您没有将结果分配DT[]给某物,您最终会打印出`DT[] 评估结果的结果(j在这些情况下y.tsz.ts和 分别为参数的结果。

只需将这些调用隐藏起来,它就不会打印出来,或者使结果变成其他东西

使用隐形

# 
x.ts <- y.ts <- z.ts <- NA
invisible(DT[a == 1,{
  x.ts <<- xts(x, order.by = dat)
  y.ts <<- xts(y, order.by = dat)
  }
])
invisible(DT[
  , list(sz = mean(z/x)), by = dat][
  , z.ts <<- xts(sz, order.by = dat)])

评估j其他事物(沿途分配)

x.ts <- y.ts <- z.ts <- NA
DT[a == 1,{
  x.ts <<- xts(x, order.by = dat)
  y.ts <<- xts(y, order.by = dat)
  'Assigned y.ts and x.ts to global environment)'
  }
]
DT[
  , list(sz = mean(z/x)), by = dat][
  , {z.ts <<- xts(sz, order.by = dat)
      'assigned x.ts'}]

在这种情况下,结果将分别是 'Assigned y.ts and x.ts to global environment)''assigned x.ts'

于 2013-02-07T01:38:36.637 回答