Глобальные тихие назначения из data.table

Я работаю с несколькими временными рядами и их характеристиками в таблице 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.ts и z.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

Как я могу сделать этот тип присваивания в таблице данных бесшумным? Оправдано ли такое использование <<- или есть лучший способ сделать это?


person Ryogi    schedule 07.02.2013    source источник


Ответы (1)


<<- оправдано, хотя и несколько непрозрачно.

Что бы вы ни делали в j, если вы не используете :=, если вы не присваиваете результат DT[] чему-то, вы в конечном итоге печатаете результат того, что оценивает `DT[] (результат аргумента j в этих случаях y.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'}]

В этом случае результаты будут 'Assigned y.ts and x.ts to global environment)' и 'assigned x.ts' соответственно.

person mnel    schedule 07.02.2013