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
相关产品推荐
相关产品推荐

