如何用单个Rmd模板生成多页面Rmarkdown网站?
问题
使用Rmarkdown构建网站时,通过循环渲染带参数的模板页面(templates/page.rmd),生成的页面顶部缺失_site.yml中定义的导航栏,需要非Shiny的解决方法。
解决方案核心
单独调用rmarkdown::render()渲染模板不会读取_site.yml的全局网站配置(包括导航栏),必须将这些模板页面纳入rmarkdown::render_site()的处理流程,才能让页面应用导航栏等全局样式。
具体修改步骤
- 修正模板文件的参数引用错误,确保代码能正确读取传入的数据集
- 调整渲染逻辑,先将模板页面渲染到项目根目录(而非直接写入
_site) - 统一调用
rmarkdown::render_site()处理所有页面,应用导航栏配置 - 修正
_site.yml中导航链接与输出文件名的一致性
1. 修正模板文件 templates/page.rmd
--- params: data_set: NULL # 明确参数默认值 title: "Region results" --- ```{r} # 修正参数引用拼写错误:params$data_set 而非 param$dataset hist(params$data_set$Sepal.Length)
## 2. 修正渲染脚本 `script.R` ```r # 清理旧的_site目录(可选,避免缓存干扰) unlink("_site", recursive = TRUE) # 定义要处理的物种列表 species_list <- c("versicolor", "setosa") # 循环渲染模板页面到项目根目录 for (sp in species_list) { # 过滤数据:注意iris数据集的物种列名是大写的Species data_filtered <- dplyr::filter(iris, Species == sp) rmarkdown::render( input = "templates/page.rmd", params = list(data_set = data_filtered), output_file = paste0(sp, ".html"), output_dir = getwd() # 输出到项目根目录,让render_site能识别并处理 ) } # 统一渲染整个网站,应用_site.yml的导航栏配置 rmarkdown::render_site()
3. 修正 _site.yml 的导航链接
确保导航菜单中的href与输出文件名完全匹配:
name: "website" navbar: title: "website" left: - text: "global info" href: index.html - text: "species" menu: - text: "all species result" href: all.html - text: "---------" - text: "versicolor" href: versicolor.html # 修正为匹配输出文件名 - text: "setosa" href: setosa.html
额外注意事项
- 避免直接将渲染结果写入
_site目录:该目录是render_site()的自动输出目录,手动写入的文件不会被应用全局配置 - 确保变量拼写一致:比如
species向量的遍历、iris数据集的列名Species、模板中的参数名data_set - 如果需要隐藏模板文件不被网站默认渲染,可以在
_site.yml中添加exclude: ["templates/"]配置,但本场景无需设置,因为我们已主动触发模板渲染
内容的提问来源于stack exchange,提问作者sbenateau
相关产品推荐
相关产品推荐

