自定义环境下RMarkdown中map调用glue报错的解决方法
解决方案:自定义环境下render Rmd时map_chr调用glue的作用域问题
方案1:设置glue的全局默认求值环境
在调用rmarkdown::render前,通过options()指定glue使用自定义环境作为默认求值环境,这样无论glue在哪里被调用,都会到这个环境中查找变量:
# 创建自定义环境 my_custom_env <- new.env(parent = globalenv()) # 让glue默认使用自定义环境求值 options(glue.glue_env = my_custom_env) # 调用render,指定运行环境为自定义环境 rmarkdown::render("target_doc.Rmd", envir = my_custom_env)
方案2:在自定义环境中重定义map_chr
重新定义purrr::map_chr,强制它在自定义环境中执行传入的函数,确保glue能访问到Rmd中的变量:
my_custom_env <- new.env(parent = globalenv()) # 在自定义环境中覆盖map_chr my_custom_env$map_chr <- function(.x, .f, ...) { purrr::map_chr(.x, rlang::as_function(.f, env = my_custom_env), ...) } # 执行render rmarkdown::render("target_doc.Rmd", envir = my_custom_env)
问题原因
- RStudio的knit按钮默认在一个继承自全局环境的专用环境中运行Rmd代码,
purrr::map_chr调用glue时,glue能沿着环境链找到Rmd中定义的变量(如a)。 - 当使用自定义环境调用
rmarkdown::render时,map_chr内部的执行环境父链不包含这个自定义环境,导致glue无法找到变量。上述方案通过强制glue或map_chr使用自定义环境,解决了作用域查找的问题。
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

