如何批量运行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
相关产品推荐
相关产品推荐

