Сохранение графиков в столбце списка данных.

Когда я запускаю...

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[...] верна:

SGyYB.png

Пока воспроизведение неверно:

2hzqi.png

В записанном графике окончательные значения x и y магически применяются ко всем трем графам, вероятно, из-за того, как data.table обрабатывает указатели на столбцы, определенные в by= группах.

Я не уверен, что понимаю, что происходит, потому что я могу изменить пример поверхностно, написав v = id2*1:10 вместо v = id*10 + id2*1:10 и - poof - проблема исчезает.

Я хотел бы знать (i), почему это происходит, и (ii), какую простую настройку я могу сделать, чтобы обойти это?

Ответы

Ответ 1

Один рабочий хак - написать j как

with(copy(.SD), {yada yada})

или аналогичный, что гарантирует, что ссылки относятся к копии каждой группы .SD и не сжимаются.