如何从R包向Quarto文档传递数据?解决模板找不到报错
解决R包调用Quarto模板及传递数据的完整步骤
1. 修正模板调用的语法错误
你的usethis::use_template调用存在两个语法问题,这是触发"object 'QuartoDemo.qmd' not found"错误的直接原因:
template参数需传入字符串格式的文件名,你直接写QuartoDemo.qmd会被R识别为变量而非文件名,必须加引号包裹save_as参数同理,example需要改为字符串形式(比如"example.qmd")
修正后的调用代码:
usethis::use_template( template = "QuartoDemo.qmd", save_as = "example.qmd", data = list(Package = "Demo"), package = "Demo" )
2. 调整模板文件的目录结构
R包的模板文件必须放置在**inst/templates**目录下,而非根目录的templates文件夹——usethis的use_template默认会查找包内inst/templates路径下的文件。你需要:
- 将原
templates/QuartoDemo.qmd移动到inst/templates/QuartoDemo.qmd - 运行
devtools::document()或devtools::build()重新构建包
3. 正确传递函数数据到Quarto模板
要实现将函数hello()中的数据传递到Quarto模板,需调整函数逻辑与模板内容:
3.1 修正R函数的返回与导出逻辑
原hello()仅打印字符串且无返回值,同时@export text123属于错误写法(应导出函数而非变量),修改后:
#' DemoQuarto #' #' @return 返回要传递给Quarto模板的文本内容 #' @export hello <- function() { text123 <- "Hello, world!" return(text123) }
3.2 修改Quarto模板以接收数据
Quarto模板可通过{{ }}语法读取use_template传递的data参数,也可直接调用包内函数获取数据,修改QuartoDemo.qmd:
--- title: "Demo Quarto Document" --- ```{r} # 方式1:调用包内函数获取数据 text123 <- Demo::hello() print(text123) # 方式2:直接使用use_template传递的参数 print("当前包名: {{ Package }}")
### 3.3 整合模板生成的调用逻辑 可编写专门函数触发模板生成并传递自定义数据: ```R #' 生成带数据的Quarto演示文档 #' @export generate_quarto_demo <- function() { # 获取函数返回的待传递数据 demo_text <- hello() # 调用模板并传递数据 usethis::use_template( template = "QuartoDemo.qmd", save_as = "demo_output.qmd", data = list( Package = "Demo", TextContent = demo_text ), package = "Demo", open = FALSE # 可选,是否自动打开生成的文档 ) }
此时Quarto模板还能直接使用{{ TextContent }}调用传递的文本:
直接输出传递的内容: {{ TextContent }}
4. 验证包的有效性
完成上述调整后,执行以下步骤确认:
- 运行
devtools::document()更新文档与导出信息 - 运行
devtools::check()检查包是否存在错误 - 安装包后调用
Demo::generate_quarto_demo(),查看生成的Quarto文档是否能正确输出Hello, world!
内容的提问来源于stack exchange,提问作者Russ Conte
相关产品推荐
相关产品推荐

