在R Markdown编织时调用其他.Rmd文件的数据与函数的方法
解决Rmarkdown分文件编织时找不到数据与函数的问题
这问题我之前帮好几个开发者解决过,核心原因其实很简单——RStudio里运行代码是复用当前会话的环境,但编织Rmd的时候会启动一个全新的R会话,之前运行的01和02里的数据、函数根本不会自动带过来!给你几个靠谱的解决办法:
方法1:把依赖文件转成R脚本并调用
这是最直接的方案,步骤如下:
- 先把你的01和02 Rmd文件里的可执行代码提取成纯R脚本。你可以手动复制粘贴,或者用
knitr的工具一键生成:# 在RStudio控制台运行这两行,生成对应的R脚本 knitr::purl("01_Import_and_clenase.Rmd", output = "01_Import_and_clenase.R") knitr::purl("02_Functions.Rmd", output = "02_Functions.R") - 然后在
03_Test_of_Assumptions.Rmd的开头(建议放在setup代码块里)添加:```{r setup, include=FALSE} # 确保三个文件在同一文件夹下,直接用文件名即可;如果路径不同,写完整相对路径 source("01_Import_and_clenase.R") source("02_Functions.R")这样编织03的时候,就会先运行这两个脚本,把数据和函数全部加载到新会话里。
方法2:直接读取其他Rmd的代码块(无需转脚本)
如果你不想额外生成R脚本,可以用knitr::read_chunk()直接读取其他Rmd里的代码:
- 在
03_Test_of_Assumptions.Rmd的setup代码块里添加:```{r setup, include=FALSE} knitr::read_chunk("01_Import_and_clenase.Rmd") knitr::read_chunk("02_Functions.Rmd") - 接着给01和02里需要执行的代码块加上标签,比如在01的代码块开头加一行注释
# ---- load_clean_data,在02的代码块开头加# ---- define_custom_functions; - 最后在03里调用这些标签的代码块:
```{r load_clean_data, echo=FALSE}这样就会精准执行对应代码块,加载你需要的数据和函数。
额外注意:统一工作目录避免路径坑
有时候明明路径写对了但还是找不到文件,是因为编织时的默认工作目录和你手动运行时不一样。建议:
- 用RStudio项目(
.Rproj)管理你的整个项目,打开项目后工作目录始终是项目根目录; - 或者在03的setup代码块里强制设置根目录:
```{r setup, include=FALSE} # 先安装rprojroot包:install.packages("rprojroot") knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())这样不管编织时默认目录是什么,都会切换到项目根目录,确保所有文件路径都能正确识别。
关键提醒:永远不要依赖RStudio的全局环境来保存数据/函数,编织Rmd是独立会话,必须显式加载所有依赖!
内容的提问来源于stack exchange,提问作者Steen Harsted
相关产品推荐
相关产品推荐

