You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用gmailR发送邮件时,无法显示ggvis生成的柱状图

问题原因分析

你遇到的核心问题是ggvis生成的是交互式HTML可视化,无法直接嵌入邮件:

  1. ggvis依赖JavaScript渲染交互效果,但绝大多数邮件客户端(比如Gmail)会禁用外部JS和动态内容,直接拼接ggvis对象到邮件HTML里根本无法渲染。
  2. 你直接把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:43