数据表中的全局静默分配

时间:2013-02-07 01:24:19

标签: r data.table xts

我正在处理数据中的几个时间序列及其特征 长格式,我想构建几种不同类型的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环境中创建,而不是在全局环境中创建 环境。
  3. 要解决(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
    

    如何在数据表中进行此类分配? 这种<<-的使用是否合理,或者有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

如果有点不透明,

<<-是合理的。

无论您在j中执行什么操作,除非您使用:=,否则如果您未将DT[]的结果分配给某些内容,则最终会打印出`DT[]的结果1}}在这些情况下jy.ts分别评估(z.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'}]

在哪种情况下结果将是 <{1}}和'Assigned y.ts and x.ts to global environment)'