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

如何批量运行R项目子文件夹中的script_n.R并解决路径问题?

批量运行嵌套子目录中带misty::setsource()的R脚本问题

问题背景

  • 项目结构:父文件夹下存放run_scripts.R和核心项目文件,子文件夹(含多层嵌套子目录)中是script_n.R系列脚本
  • 每个script_n.R开头通过misty::setsource()设置工作目录,模拟生成的数据需写入脚本所在子文件夹下的_Data_目录
  • 依赖misty和MplusAutomation包

已尝试的方法及报错

方法1:使用source(..., chdir=T)

source("child_folder/script_n.R", chdir = T)

报错信息:

Error in file(file, ifelse(append, "a", "w")) : parent folder 
  cannot open the connection
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
  cannot open file 'child_folder/grand_child_folder/Data.dat': No such file or directory.

方法2:自定义sourceFolder批量加载脚本

## 查找文件夹下所有.R/.r文件并执行
sourceFolder <- function(folder, recursive = FALSE, ...) 
{ 
  files <- list.files(folder, pattern = "[.][rR]$", 
                      full.names = TRUE, recursive = recursive)
  if (!length(files))
    stop(simpleError(sprintf('No R files in folder "%s"', folder)))
  src <- invisible(lapply(files, source, ...))
  message(sprintf('%s files sourced from folder "%s"', length(src), folder))
}

sourceFolder("child_folder", recursive = TRUE)

执行后仍出现类似方法1的路径找不到错误

方法3:使用system()命令调用脚本

system("child_folder/script_n.R", intern = TRUE)

同样因路径解析失败报错

问题核心

source(..., chdir=T)的工作目录切换逻辑与misty::setsource()的路径解析不兼容,手动将所有路径改为"folder/_Data_/Data_"这类明确形式可正常运行,但需修改大量脚本代码,希望找到无需大规模改动的解决方案。

可行解决方案

方案1:自定义带目录切换的source函数(推荐)

核心思路是先切换到目标脚本所在目录,执行脚本后再切回原工作目录,确保misty::setsource()能正确识别脚本所在的子目录路径:

# 单个脚本执行函数
source_with_dir <- function(file_path, ...) {
  # 保存原始工作目录,确保执行完后恢复
  original_wd <- getwd()
  on.exit(setwd(original_wd))
  
  # 切换到脚本所在目录
  script_dir <- dirname(file_path)
  setwd(script_dir)
  
  # 执行脚本(关闭chdir,避免冲突)
  source(file_path, chdir = FALSE, ...)
}

# 批量执行函数(基于上面的单个执行函数改造)
sourceFolder <- function(folder, recursive = FALSE, ...) {
  files <- list.files(folder, pattern = "[.][rR]$", 
                      full.names = TRUE, recursive = recursive)
  if (!length(files))
    stop(sprintf('No R files in folder "%s"', folder))
  
  # 遍历所有脚本,用source_with_dir执行
  src <- invisible(lapply(files, source_with_dir, ...))
  message(sprintf('%s files sourced from folder "%s"', length(src), folder))
}

# 调用批量执行函数
sourceFolder("child_folder", recursive = TRUE)

方案2:临时切换工作目录(单脚本测试用)

如果仅需测试单个脚本,可手动切换到脚本所在目录后再执行:

# 保存原目录
original_wd <- getwd()
# 切换到脚本所在子目录
setwd("child_folder/grand_child_folder")
# 执行脚本
source("script_n.R")
# 切回原目录
setwd(original_wd)

内容的提问来源于stack exchange,提问作者Reeta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:43:20