gpt4 book ai didi

r - 如何序列化/反序列化 ggplot 对象以在 R 中与 mongodb 一起使用

转载 作者:可可西里 更新时间:2023-11-01 10:48:51 26 4
gpt4 key购买 nike

我有这个代码:

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),然后反序列化它以获得相同的对象?

最佳答案

这项工作,而不是递归序列化器/反序列化器,只需要一个级别,也不需要序列化名称,因为它们不再有点,只有嵌套的绘图数据有它们。

serializePlots <- function(data) {
lapply(data, function(plot) {
rawToChar(serialize(plot, NULL, ascii = TRUE))
})
}

unserializePlots <- function(data) {
lapply(data, function(obj) {
if (is.serialized(obj)) {
unserialize(charToRaw(obj))
} else {
obj
}
})
}

关于r - 如何序列化/反序列化 ggplot 对象以在 R 中与 mongodb 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com