【发布时间】:2018-11-15 06:53:53
【问题描述】:
我正在寻找一种方法来保存一些ggplot 对象以供以后使用。 dput 函数创建一个字符串,当传递给dget() 时会返回意外< 的错误:
- 第一个在这里:
.internal.selfref = <。这可以通过将.internal.selfref设置为NULL轻松解决。 - 剩余的七个分布在不同的属性中,参数为
<environment>。我尝试将<environment>更改为NULL或environment()之类的东西,但它们都不起作用 - 环境设置不正确并且返回了找不到对象错误。
一些搜索让我找到了函数ggedit::dput.ggedit。但它给了我错误:
# Error in sprintf("%s = %s", item, y) :
# invalid type of argument[2]: 'symbol'
我在想,要么我使用dput 函数正确设置环境,要么我弄清楚为什么ggedit::dput.ggedit 不起作用...
有什么想法吗?
【问题讨论】:
-
您可以将其保存为
.rds和saveRDS() -
请注意,我宁愿保存 ggplot 的输入数据(不是 ggplot 对象)。然后,如果 ggplot 库升级/降级,您保存的对象可能无法打印,或者您获得了新的数据输入来绘制,那么最好让数据和脚本重新运行。
-
您能否在有关“为什么”要使用 dput 保存 ggplot 对象的问题中添加一些信息?要从数据到最终的可视化图表(假设您已将 ggplot2 对象分配给名为
gg的变量),它会执行ggplot_gtable(ggplot_build(gg))。您应该查看每个人的str(),尤其是最初的gg。这——rud.is/books/creating-ggplot2-extensions/…——为你展示了它们。可能导致 RDS 巨大尺寸的 1 件事是原始gg的 1 个元素是$ plot_env :<environment: R_GlobalEnv>(因此顺带一提。 -
各种对象结构(甚至
gg)随着每个ggplot2版本而变化,因此@zx8754指出随着时间的推移依赖该结构的序列化版本是“不安全的”。如果您真的想将其“序列化”到一个文件中,dput()您的最终数据并将 + ggplot2 绘图命令放入 R 文件中。 -
所以,然后将您传递到 ggplot2 绘图构建链中的对象的每个汇总版本保存为 RDS,并在调用
ggplot()之前将其读入。这是很常见的事情。我从 Athena 和 Drill 中提取 lots(我的意思是,你无缘无故地使用粗体,所以我认为这是流行的)数据,并做同样的事情,效果非常好。我认为您没有意识到 ggplot2 携带数据(我必须指出这一点,因为您没有费心阅读我发布的链接)。