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

Shiny应用:Word转HTML预览时图表无法显示的问题

解决Word转HTML时图表不显示的问题

问题根源

用body_add_gg插入到Word里的ggplot是嵌入式图片,默认情况下pandoc转换docx到HTML时不会自动提取这些嵌入的图片,导致HTML无法加载图表。


方法一:调整pandoc转换参数

给pandoc_convert加上--extract-media参数,指定嵌入图片的提取目录,让HTML能正确引用这些图片。修改后的代码如下:

# Create a ggplot
plot_ggplot <- function() {
  ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
    geom_point() +
    labs(title = "Scatter Plot of Sepal Length vs Sepal Width",
         x = "Sepal Length",
         y = "Sepal Width")
}

# Create a FlexTable
flex_table <- flextable(head(iris))

# Create a Word document
doc <- read_docx()

# Add the FlexTable and ggplot to the document
doc <- body_add_flextable(doc, value = flex_table)
doc <- body_add_gg(doc, value = plot_ggplot())

# Save the Word document
output_file <- "iris_visualizations.docx"
print(doc, target = output_file)

# Convert Word document to HTML,添加--extract-media参数提取图片
output_html_file <- "iris_visualizations.html"
pandoc_convert(
  output_file, 
  to = "html", 
  output = output_html_file,
  # 指定图片提取到当前目录的media文件夹
  args = c("--extract-media=./media")
)

执行后会生成media文件夹,里面是从Word中提取的图表图片,HTML会自动引用这些路径,图表就能正常显示了。


方法二:Shiny中直接生成HTML预览(更高效)

既然是Shiny应用的预览需求,没必要先生成Word再转HTML,直接在Shiny里生成可预览的HTML内容更流畅:

library(shiny)
library(ggplot2)
library(flextable)
library(htmltools)

ui <- fluidPage(
  titlePanel("预览Word内容"),
  # 预览区域
  htmlOutput("preview_content"),
  # 生成Word的按钮
  actionButton("generate_word", "生成Word文档")
)

server <- function(input, output) {
  # 定义ggplot和flextable
  plot_ggplot <- function() {
    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
      geom_point() +
      labs(title = "鸢尾花萼片长度vs宽度散点图",
           x = "萼片长度",
           y = "萼片宽度")
  }
  
  flex_table <- flextable(head(iris))
  
  # 生成预览HTML
  output$preview_content <- renderUI({
    tagList(
      # 把flextable转成HTML元素
      htmltools_value(flex_table),
      # 把ggplot转成图片嵌入HTML
      plotOutput("plot_preview")
    )
  })
  
  output$plot_preview <- renderPlot({
    plot_ggplot()
  })
  
  # 点击按钮生成Word
  observeEvent(input$generate_word, {
    doc <- read_docx()
    doc <- body_add_flextable(doc, value = flex_table)
    doc <- body_add_gg(doc, value = plot_ggplot())
    print(doc, target = "iris_visualizations.docx")
    showModal(modalDialog("Word文档已生成!", easyClose = TRUE))
  })
}

shinyApp(ui, server)

这种方式直接在Shiny界面渲染表格和图表,预览体验更好,同时保留生成Word的功能,完全绕开了pandoc转换的问题。


内容的提问来源于stack exchange,提问作者Mel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:38:15