使用gmailR发送邮件时,无法显示ggvis生成的柱状图
问题原因分析
你遇到的核心问题是ggvis生成的是交互式HTML可视化,无法直接嵌入邮件:
- ggvis依赖JavaScript渲染交互效果,但绝大多数邮件客户端(比如Gmail)会禁用外部JS和动态内容,直接拼接ggvis对象到邮件HTML里根本无法渲染。
- 你直接把
bar这个ggvis对象和字符串拼接,得到的不是有效的HTML代码,而是ggvis对象的字符化表示(类似<ggvis>),自然无法显示成图表。
解决方案:导出为静态图片嵌入邮件
最稳妥的方式是把ggvis图表转为静态PNG/JPG图片,作为邮件附件嵌入到HTML内容中。以下是修改后的完整代码:
第一步:安装必要依赖包
install.packages(c("ggvis", "gmailr", "tableHTML", "webshot2")) webshot2::install_chromium() # 安装浏览器驱动,用于将HTML转为图片
第二步:修改代码实现图片嵌入
library(ggvis) library(gmailr) library(RMySQL) library(tableHTML) library(webshot2) # 生成ggvis柱状图 bar <- data %>% ggvis(~supplier_city, ~no_of_orders, fill="blue") %>% layer_bars() # 将ggvis导出为临时HTML,再转为PNG图片 temp_html <- tempfile(fileext = ".html") print(bar, file = temp_html) # 把ggvis保存为HTML文件 temp_png <- tempfile(fileext = ".png") webshot(temp_html, temp_png, vwidth = 800, vheight = 600) # HTML转静态PNG # 准备邮件HTML内容 msg <- tableHTML(data, rownames = FALSE) html_bod <- paste0( "<p> Maximum order Time </p>", time, # 通过cid引用附件中的图片(cid值要和attach_file的id一致) '<img src="cid:order_city_bar" alt="Order Count by Supplier City" style="width:100%;max-width:800px;">', msg ) # 发送邮件 use_secret_file("/Users/abhi/Downloads/gmailR.json") mime() %>% to("1234@gmail.com") %>% from("1234@p.in") %>% subject("Data ") %>% html_body(html_bod) %>% attach_file(temp_png, id = "order_city_bar") # 给附件设置id,对应HTML里的cid send_message()
关键细节说明
- 为什么用HTML转PNG?因为ggvis本身是交互式的,只能先导出为HTML,再通过webshot2渲染成静态图片,这样邮件客户端才能识别显示。
cid:xxx是邮件中嵌入附件图片的标准方式:给附件设置唯一id,HTML中用cid引用,避免图片被当作普通附件,而是直接显示在邮件内容里。
内容的提问来源于stack exchange,提问作者Abhishek Gupta
相关产品推荐
相关产品推荐

