R与Quarto循环内无法生成多标题及图表问题排查
问题描述
我在RStudio中编写Quarto文档,想要通过for循环生成对应不同区域的标题和箱线图,但运行后只显示第一个区域的标题,后面两个区域的标题不生效,图表倒是能正常生成。完整代码如下:
--- title: "Generate Headers" format: html editor: visual ---
Generate dataframe
#| echo: false #| warning: false library(tidyverse) region = c(replicate(100,"A"),replicate(100,"B"),replicate(100,"C")) variable = c(replicate(50,"var_a"),replicate(50,"var_b"),replicate(50,"var_a"),replicate(50,"var_b"),replicate(50,"var_a"),replicate(50,"var_b")) value = runif(300, min = 0, max = 100) df = data.frame(region = region, variable = variable, value = value)
Plots
#| echo: false #| results: asis regions_values <- unique(df$region) for (region_value in regions_values){ cat("## ", region_value, "\n") dfplot <- df |> filter(region == region_value) p <- ggplot(dfplot, aes(x=variable, y=value)) + geom_boxplot() print(p) cat("\n") }
问题原因
问题出在results: asis的输出逻辑上:ggplot生成的图表会以HTML元素的形式插入到文档中,而直接用cat()输出的Markdown标题,在紧跟HTML元素时,Quarto的语法解析器无法正确识别后续的Markdown标题语法,导致后面的标题被当成普通文本处理。
修复方案
有两种简单的解决方式:
方式1:使用knitr::asis_output()输出标题
用knitr::asis_output()替代cat()来输出Markdown标题,它会确保Markdown语法被Quarto正确解析:
#| echo: false #| results: asis regions_values <- unique(df$region) for (region_value in regions_values){ knitr::asis_output(paste0("## ", region_value, "\n\n")) dfplot <- df |> filter(region == region_value) p <- ggplot(dfplot, aes(x=variable, y=value)) + geom_boxplot() print(p) cat("\n\n") }
方式2:给cat()添加更多换行
如果坚持使用cat(),需要在标题前后添加足够的换行,让Markdown标题和图表的HTML输出之间有明确分隔,确保解析器能识别标题:
#| echo: false #| results: asis regions_values <- unique(df$region) for (region_value in regions_values){ cat("\n\n## ", region_value, "\n\n") dfplot <- df |> filter(region == region_value) p <- ggplot(dfplot, aes(x=variable, y=value)) + geom_boxplot() print(p) cat("\n\n") }
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

