Quarto仪表盘如何实现带参数的可复用模块?
问题
我开发Shiny仪表盘时会用模块规整代码,现在尝试Quarto仪表盘(其他Quarto文档也适用),想沿用类似思路做可复用的「模块」——比如一个带图表和数据标签页的标签集卡片,能传不同参数多次调用。
我知道Quarto的Includes功能(比如{{< include partials/my_tabset.qmd >}}),但它只支持一级引用(嵌套文件夹里的片段没法再引用其他内容),还不能传参数。
目前想到一个方法:写个小型R包装函数,调用quarto render处理带参数的片段再嵌入主文档,但感觉有点繁琐。我已经了解Quarto Discussion #8735,想知道有没有其他可选方案?
示例代码
main.qmd
--- title: "tester" author: "Me Myself and I" format: dashboard --- ```{r} # small helper function insert_module <- function(file, ...) { env <- environment() env$params <- list(...) content <- knitr::knit_child(file, quiet = TRUE, envir = env) cat(content, sep = "\n") }
mtcars
insert_module("partials/my_tabset.qmd", data = mtcars)
chickwts
insert_module("partials/my_tabset.qmd", data = chickwts)
### partials/my_tabset.qmd ```qmd --- params: data: mtcars --- ## Column {.tabset title="Insights"} ```{r} #| title: plot plot(params$data[[1]], params$data[[2]])
#| title: data params$data
--- # 可选方案 下面是几种更简洁的实现可复用参数化模块的方式: ## 1. 优化`knitr::knit_child`封装 你当前用`knit_child`的思路是R生态下最直接的方案,可以进一步简化: - 把`insert_module`放到单独的R脚本(比如`R/utils.R`),主文档通过`source("R/utils.R")`引入,减少主文档冗余。 - 给函数加默认路径前缀,缩短调用代码: ```r insert_module <- function(file, ..., prefix = "partials/") { full_path <- file.path(prefix, file) env <- new.env(parent = globalenv()) env$params <- list(...) content <- knitr::knit_child(full_path, quiet = TRUE, envir = env) cat(content, sep = "\n") }
调用时只需写insert_module("my_tabset.qmd", data = mtcars),更简洁。
2. 使用quarto::quarto_render渲染参数化子文档
如果不想依赖knit_child,可以直接用Quarto的R接口渲染带参数的子文档,再嵌入主文档:
insert_quarto_module <- function(file, ...) { temp_file <- tempfile(fileext = ".html") quarto::quarto_render( file, output_file = temp_file, params = list(...), quiet = TRUE ) cat(readLines(temp_file), sep = "\n") }
注意需要子文档输出格式和主文档兼容,适合仪表盘这类HTML场景。
3. 自定义Lua过滤器(进阶)
如果想脱离R代码,用Quarto原生方式实现参数化引用,可以写Lua过滤器扩展Includes功能:
- 自定义指令比如
{{< module partials/my_tabset.qmd data=mtcars >}} - 在过滤器里解析参数,动态渲染片段并注入内容
这种方式更贴近Quarto原生工作流,但需要熟悉Lua语法和Quarto过滤器机制。
4. 尝鲜Quarto 1.4+的参数化Partials特性
Quarto 1.4及以上版本正在开发带参数的Partials功能(对应你提到的Discussion #8735),正式发布后可直接用原生语法:
{{< include partials/my_tabset.qmd params=data=mtcars >}}
如果能使用预览版Quarto,可以提前试用该特性。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

