You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:20:46