调用rmarkdown::render()时flextable的as_image()函数报错如何解决
问题产生原因
该报错由渲染环境差异和包命名空间冲突共同导致:
- 点击RStudio的Knit按钮渲染时,RStudio会启动全新的独立R进程执行渲染,不会继承当前工作环境中已加载的第三方包,包加载顺序完全由Rmd文档内的代码控制,不存在函数掩蔽问题,因此功能正常。
- 手动调用
rmarkdown::render()渲染时,默认在当前R会话环境中执行,如果当前环境提前加载了kableExtra包,其导出的save_kable泛型函数会干扰flextable处理内嵌图片的函数调度逻辑,导致程序错误调用不匹配的save_kable方法,最终触发如下报错:
Error in save_kable(x = x, file = temp_png, ...) :
argument "x" is missing, with no default
修复方案
根据使用场景选择以下任意一种方案即可:
- 方案1(最推荐):和Knit按钮行为保持一致,调用render时指定独立的全新运行环境,彻底隔离当前工作环境的包干扰:
rmarkdown::render( input = "path_to_file/file.Rmd", envir = new.env(parent = globalenv()) )
- 方案2:如果文档不需要使用kableExtra功能,可在Rmd文档的第一个可执行代码块开头加入以下代码,提前卸载冲突包避免函数掩蔽:
if ("package:kableExtra" %in% search()) { detach("package:kableExtra", unload = TRUE, character.only = TRUE) }
- 方案3:将
flextable、officer、officedown三个包全部更新至CRAN最新正式版本,新版本已修复多数跨包函数调度的兼容问题。
内容的提问来源于stack exchange,提问作者Sophie Wupper
相关产品推荐
相关产品推荐

