如何从shinyapps.io下载含多字节字符图表的Rmarkdown PPTX报告
我遇到过类似的问题,核心原因是rmarkdown::render生成pptx时是在独立的R环境中运行的,不会继承你在app里配置好的showtext设置,再加上shinyapps.io本身没有预装日语字体,所以下载的pptx里字符才会缺失。给你一套可行的解决方案:
1. 把日语字体文件加入项目
首先下载一款日语字体(比如Google的Noto Sans JP,免费且兼容性好),将字体文件(例如NotoSansJP-Regular.otf)放到项目根目录下新建的fonts文件夹中。部署到shinyapps.io时,这个文件夹要一起上传。
2. 修改Rmd文件,独立配置showtext
在test.Rmd中,我们需要在渲染环境里重新初始化showtext,同时通过参数接收app里生成的图表:
--- title: "test" output: powerpoint_presentation params: plot_obj: NULL # 用于接收app传递的图表对象 ---
```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE, dev = "png") # 指定png设备,适配showtext的字体渲染 library(showtext) # 注册项目中的日语字体 font_add("notosansjp", regular = "../fonts/NotoSansJP-Regular.otf") showtext_auto(enable = TRUE)
マルチバイト文字
# 显示从app传递过来的图表 params$plot_obj
### 3. 更新downloadHandler,传递图表对象 修改app的server部分,把生成好的图表通过`params`参数传递给Rmd,确保渲染时能拿到正确的图表: ```r output$dl <- downloadHandler( filename = function(){"test.pptx"}, content = function(con){ rmarkdown::render( input = "test.Rmd", output_file = con, params = list(plot_obj = tempplot()) # 将reactive生成的图表传入Rmd ) } )
额外提醒
- 部署时确认
fonts文件夹被包含在shinyapps.io的部署包中(rsconnect通常会自动检测,若未检测到可手动添加)。 - 如果使用其他日语字体,记得调整
font_add中的文件路径和字体名称。 - 指定
dev="png"是因为showtext对光栅图形设备的字体渲染更稳定,能避免矢量设备下的字符丢失问题。
这样修改后,生成的pptx文件就能和app中显示的一样,正常展示日语多字节字符了。
内容的提问来源于stack exchange,提问作者ironwest
相关产品推荐
相关产品推荐

