autoplot сохраняет пустой график на устройстве png, когда объединяется в data.table - PullRequest
0 голосов
/ 04 мая 2018

У меня есть data.table с колонкой с прогнозами некоторых значений, и я хочу сохранить графики каждого из этих прогнозов с ggplot2::autoplot.

Я пытаюсь это (воспроизводимый пример):

require(data.table)
require(forecast)
require(ggplot2)

## create data.table
a <- data.table(id = 1:2)
a[, x := .(list(sample(1:10, 5, FALSE))), by = id]
a[, y := .(list(forecast(x[[1]]))), by = id]

## plot by id:
a[, {png(paste0(id, ".png")); autoplot(y[[1]]); dev.off()}, by = id]

но он создает пустые холсты.

Однако работает следующий код:

png("1.png")
a[1, autoplot(y[[1]])]
dev.off()

Что заставляет меня думать, что это что-то с цепочкой команд внутри {}. Следующий код также работает (поскольку plot не работает с объектами прогноза, я строю переменную x:

a[, {png(paste0(id, ".png")); plot([[1]]); dev.off()}, by = id]

, что заставляет меня думать о autoplot.

Что я делаю не так, и как можно эффективно достичь того, чего я хочу?

1 Ответ

0 голосов
/ 04 мая 2018

Не глядя на код autoplot, разница между этими двумя выражениями заключается в скрытом print, что происходит во 2-м случае, поскольку это выражение возвращает объект, созданный autoplot, который затем "печатает" ядро ​​R ( что может означать разные вещи для разных объектов).

Таким образом, исправление заключается в вызове print себя:

a[, {png(paste0(id, ".png")); print(autoplot(y[[1]])); dev.off()}, by = id]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...