【发布时间】:2017-08-28 22:53:54
【问题描述】:
我有这个代码:
for(plot in plotResults) {
.session$plots[[plot$id]] <- if (!is.null(plot[["grob"]])) {
plot[["grob"]]
} else {
plot[["plot"]]
}
ggsave(paste0(plot$id, ".png"), .session$plots[[plot$id]])
...
}
文件已生成,但是当我使用此工具将 ggplot 对象保存到 mongo 时:
serializeObj <- function(obj) {
if (is.list(obj)) {
structure(lapply(obj, serializeObj), names = serializeNames(obj))
} else {
rawToChar(serialize(obj, NULL, ascii = TRUE))
}
}
deserializeObj <- function(obj) {
if (is.list(obj)) {
structure(lapply(obj, deserializeObj), names = unserializeNames(obj))
} else if (is.serialized(obj)) {
unserialize(charToRaw(obj))
} else {
obj
}
}
## Replaces characters illegal in Mongo names with "safe" substitutes
safeNames <- function(value) {
gsub("\\.", "___DOT___", value)
}
## Replaces back "safe" substitutes
unsafeNames <- function(value) {
gsub("___DOT___", ".", value)
}
serializeNames <- function(obj) {
lapply(names(obj), safeNames)
}
unserializeNames <- function(obj) {
lapply(names(obj), unsafeNames)
}
我在保存到 mongo 之前运行 serializeObj,然后在从 mongo 读取后运行 deserializeObj。在读取而不是 ggplot 对象后,我得到了列表,我无法在该列表上调用 ggsave。
如何序列化某种类型的对象,例如 ggplot,然后反序列化它以获得相同的对象?
【问题讨论】:
-
ggplot 是一个(嵌套的)列表。使用
str进行检查。您的方法会丢失属性,最重要的是类属性。 -
@Roland 有没有办法恢复类属性?
-
help("attr"),help("attributes"),当然需要先存储。否则,我们将讨论一些子列表属性的手动工作。
标签: r mongodb serialization ggplot2