19 Office 文档
本章主要介绍办公文档 Word、演示报告 PowerPoint 和电子邮件 Email 三类应用。在 R 语言社区中,Quarto 文档支持输出 Word 和 PowerPoint 格式,blastula 包可以将 R Markdown 文档转化为电子邮件内容,从而实现代码化、可重复和批量化,提高工作效率。
19.1 Word 文档
19.1.1 Markdown 制作 Word 文档
本节探索 (R) Markdown + Pandoc 以 Word 格式作为最终交付的可能性。
19.1.2 R Markdown 制作 Word 文档
docxtools、officer 和 officedown 大大扩展了 rmarkdown 包在制作 Word/PPT 方面的功能。
19.1.3 自定义 Word 模版
R Markdown 借助 Pandoc 将 Markdown 转化为 Word 文档,继承自 Pandoc 的扩展性, R Markdown 也支持自定义 Word 模版,那如何自定义呢?首先,我们需要知道 Pandoc 内建的 Word 模版长什么样子,然后我们依样画葫芦,制作适合实际需要的模版。获取 Pandoc 自带的 Word 和 PPT 模版,只需在命令行中执行
# DOCX 模版
pandoc -o custom-reference.docx --print-default-data-file reference.docx
# PPTX 模版
pandoc -o custom-reference.pptx --print-default-data-file reference.pptx
这里其实是将 Pandoc 自带的 docx 文档 reference.docx 拷贝一份到 custom-reference.docx,而后将 custom-reference.docx 文档自定义一番,但仅限于借助 MS Word 去自定义样式。
bookdown 提供的函数 word_document2()
相比于 rmarkdown 提供的 word_document()
支持图表的交叉引用,更多细节详见帮助 ?bookdown::word_document2
。
19.2 PowerPoint 演示
19.3 电子邮件
Rahul Premraj 基于 rJava 包开发的 mailR 虽然还未在 CRAN 上正式发布,但是已得到很多人的关注,也被广泛的使用,目前作者已经不维护了,继续使用有一定风险。 RStudio 公司 Richard Iannone 新开发的 blastula 扔掉了 Java 的重依赖,更加轻量化、现代化,支持发送群组邮件。
19.3.1 curl 包
curl 包提供的函数 send_mail()
本质上是在利用 curl 软件发送邮件,举个例子,邮件内容如下:
From: "张三" <邮箱地址>
To: "李四" <邮箱地址>
Subject: 测试邮件
你好:
这是一封测试邮件!
将邮件内容保存为 mail.txt 文件,然后使用 curl 命令行工具将邮件内容发出去。
curl --url 'smtp://公司邮件服务器地址:开放的端口号' \
--ssl-reqd --mail-from '发件人邮箱地址' \
--mail-rcpt '收件人邮箱地址' \
--upload-file data/mail.txt \
--user '发件人邮箱地址:邮箱登陆密码'
Gmail 出于安全性考虑,不支持这种发送邮件的方式,会将邮件内容阻挡,进而接收不到邮件。
19.3.2 blastula 包
下面以 blastula 包为例怎么支持 Gmail、Outlook、QQ 等邮件发送,先安装系统软件依赖,CentOS 8 上安装依赖
接着配置邮件帐户,这一步需要邮件账户名和登陆密码,配置一次就够了,不需要每次发送邮件的时候都配置一次
library(blastula)
create_smtp_creds_key(
id = "outlook",
user = "zhangsan@outlook.com",
provider = "outlook"
)
第二步,准备邮件内容,包括邮件主题、发件人、收件人、抄送人、密送人、邮件主体和附件等。
attachment <- "data/mail.txt" # 如果没有附件,引号内留空即可。
# 这个Rmd文件渲染后就是邮件的正文,交互图形和交互表格不适用
body <- "examples/html-document.Rmd"
# 渲染邮件内容,生成预览
email <- render_email(body) |>
add_attachment(file = attachment)
email
最后,发送邮件
smtp_send(
from = c("张三" = "xxx@outlook.com"), # 发件人
to = c("李四" = "xxx@foxmail.com",
"王五" = "xxx@gmail.com"), # 收件人
cc = c("赵六" = "xxx@outlook.com"), # 抄送人
subject = "这是一封测试邮件",
email = email,
credentials = creds_key(id = "outlook")
)
密送人实现群发单显,即一封邮件同时发送给多个人,每个收件人只能看到发件人地址而看不到其它收件人地址。