Ответ 1
Один рабочий хак - написать j
как
with(copy(.SD), {yada yada})
или аналогичный, что гарантирует, что ссылки относятся к копии каждой группы .SD
и не сжимаются.
Когда я запускаю...
library(data.table)
DT = CJ(id = 1, id2 = 1:3)[, .(
d = as.IDate("2017-01-01")+1:10, v = id*10 + id2*1:10
), by=.(id, id2)]
plotDT = DT[, {
par(mfrow = c(uniqueN(id2), 1), mar = c(2,2,.5,2))
.SD[,{
plot(d, v, type="l")
}, by=id2]
.(p = .(recordPlot()))
}, by=id]
x11()
plotDT[id == 1L, replayPlot(p[[1]])]
Строка из DT[...]
верна:
Пока воспроизведение неверно:
В записанном графике окончательные значения x
и y
магически применяются ко всем трем графам, вероятно, из-за того, как data.table обрабатывает указатели на столбцы, определенные в by=
группах.
Я не уверен, что понимаю, что происходит, потому что я могу изменить пример поверхностно, написав v = id2*1:10
вместо v = id*10 + id2*1:10
и - poof - проблема исчезает.
Я хотел бы знать (i), почему это происходит, и (ii), какую простую настройку я могу сделать, чтобы обойти это?
Один рабочий хак - написать j
как
with(copy(.SD), {yada yada})
или аналогичный, что гарантирует, что ссылки относятся к копии каждой группы .SD
и не сжимаются.