如何在两个使用here::here()的R项目间调用主脚本避免路径失效?
跨R Studio项目调用
here::here()路径问题的替代方案 直接在项目B中调用项目A的main.R时,here::here()会默认以项目B的根目录为基准,导致项目A的路径逻辑失效。除了导出CSV,以下是几种更优方案:
1. 将项目A封装为R包
这是最规范的长期解决方案:
- 把项目A生成数据集的逻辑封装成R包,通过
usethis::use_data()将数据集设为包的内置数据,或编写函数直接返回数据集。 - 项目B中可通过
devtools::load_all()加载本地开发的项目A包,或安装后直接调用,完全规避路径冲突,还能复用项目A的其他功能。
2. 用callr在独立进程运行项目A脚本
callr能在单独的R进程中执行代码,保持项目A的here上下文:
# 项目B中的代码 library(callr) # 指定项目A根目录为工作目录,运行其main.R rscript( file = "path/to/projectA/main.R", wd = "path/to/projectA" ) # 若main.R返回数据集,可直接接收;或让脚本将数据存到约定位置后读取
此方式下,项目A的here::here()会以自身根目录为基准,不受项目B干扰。
3. 临时切换here根目录
通过here::set_here()临时切换到项目A的根目录,执行完成后切回:
# 项目B中的代码 # 保存当前项目的here根目录 original_root <- here::here() # 切换到项目A根目录 here::set_here("path/to/projectA") # 运行项目A的main.R source("path/to/projectA/main.R") # 切回原项目根目录 here::set_here(original_root)
注意:必须确保执行完项目A的脚本后切回原目录,避免影响项目B后续的路径逻辑。
4. 让项目A脚本接受输出路径参数
修改项目A的main.R,允许外部传入数据集的保存路径:
# 项目A的main.R修改后 generate_dataset <- function(output_path = here::here("data/result.Rds")) { # 原数据集生成逻辑 data <- ... saveRDS(data, output_path) return(data) } # 非交互式运行时,可接收命令行参数指定路径 if (!interactive()) { args <- commandArgs(trailingOnly = TRUE) if (length(args) > 0) { generate_dataset(args[1]) } else { generate_dataset() } }
项目B中调用时,指定输出到自身可访问的路径:
# 项目B中的代码 source("path/to/projectA/main.R") my_data <- generate_dataset(output_path = here::here("data/imported_from_A.Rds"))
内容的提问来源于stack exchange,提问作者smackington
相关产品推荐
相关产品推荐

