r - 如何在不先将图像文件读/写到磁盘的情况下将简单的 R 绘图图像转换为 base64 编码?
问题描述
如何将绘图图像转换为 base64 编码而不先将其写入磁盘(即直接从 R 环境中)?
请注意,这显示了如何从图像文件中执行此操作。我无法使用文件,因为我在仅带有 R 解释器的环境中运行它(即仅临时存储)
我试过base64Encode()
这样使用
library(ggplot2)
library(dplyr)
df <- data.frame(
gp = factor(rep(letters[1:3], each = 10)),
y = rnorm(30)
)
ds <- plyr::ddply(df, "gp", plyr::summarise, mean = mean(y), sd = sd(y))
a <- ggplot(df, aes(gp, y)) +
geom_point() +
geom_point(data = ds, aes(y = mean), colour = 'red', size = 3)
library(RCurl)
a %>% base64Encode(.)
但这只是将底层绘图数据(而不是图像本身)转换为 base64。
如何将图像从 R 环境转换为 base64?
解决方案
正如您所确定的,您的a
对象不是实际的情节,而是“情节中的原始数据”。严格来说,它代表了您想要绘制的内容、变量和元素之间的映射以及所有美学(主题、颜色等)。尝试以下操作:
str(a, max.level=1)
max.level
(并逐位递增)。
当您a
在控制台中查看时,R 实际上是在调用print(a)
- 这就是为什么如果您只是从命令行运行脚本并尝试a
通过自身调用来输出绘图,则不会输出绘图。
当调用print(a)
(或间接从交互式会话中调用)时,ggplot2 通过将变量映射到 x 轴和 y 轴、颜色、映射刻面等来构建绘图。然后在图形设备上绘制结果,绘图窗口或文件。在将其发送到屏幕或文件之前,您实际上可以捕获此图形的图形表示,ggplotGrob
然后进一步操作实际图形。
这有什么帮助?
您需要使用print(a)
而不是直接编码a
(如您所见)。
即产生一个base64编码的情节,你可以这样做:
library(base64enc)
## convert image to base64 encoded string
fn <- tempfile(fileext='.png')
png(fn)
print(a)
dev.off()
base64enc::base64encode(fn)
但是:这确实要求您可以写入临时文件。老实说,我很难相信你会被阻止。
不幸的是,我不知道任何图形设备(png、bmp 等)是否可以直接写入内存流或变量而不是物理文件。
推荐阅读
- javascript - 在javascript上获取“未捕获的TypeError:无法读取未定义的属性'top'”
- android - 如何在不滚动到第一项的情况下更新嵌套的 RecyclerView
- sql - SQL查询一口气拉出所有数据库表结构?
- javascript - 在没有 .catch 的情况下创建可重用的 Promise
- php - 在通过 php 下载之前为生成的 zip 文件添加注释
- sql - 如何在 PostgreSQL 中实现资产的概念?
- excel - Excel VBA中的多次硬币投掷
- python - 箱线图绘制多个掩码数组
- sql - 嵌套查询以获取多列结果
- c# - 构造函数中的 C# 赋值给成员......不会改变它