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

R语言遍历子文件夹批量运行run_script.R及setwd报错排查

问题根因
  • setwd()报错原因:调用list.dirs时设置了full.names = F,返回的是AA、BB这类子文件夹短名,不是完整绝对路径。R执行setwd(folder)时会在当前工作目录下找这些短名对应的文件夹,匹配不到就会抛出cannot change working directory错误。
  • 仅能运行第一个子文件夹脚本的原因:第一个子文件夹里的run_script.R运行时大概率修改了全局工作目录,或者脚本内存在终止执行流的逻辑,导致后续循环的路径拼接失效,循环直接中断。
修复代码

优先用不污染全局工作目录的写法,避免脚本改路径导致的连锁错误:

# 基础配置
data_folder <- "C:/Users/mosho/Desktop/New folder (2)/"
# 获取所有子文件夹的完整绝对路径,不返回短名
allfolders <- list.dirs(path = data_folder, recursive = FALSE, full.names = TRUE)
target_script <- "run_script.R"
# 记录初始工作目录,用于异常回退
origin_wd <- getwd()

for (folder in allfolders) {
  script_path <- file.path(folder, target_script)
  # 提前判断脚本是否存在,跳过异常项避免循环中断
  if (!file.exists(script_path)) {
    warning(paste("跳过无目标脚本的文件夹:", folder))
    next
  }
  message(paste("正在执行:", script_path))

  # 写法1:推荐,临时切换目录,运行完自动还原,无需手动处理回退
  # 未安装withr包先执行 install.packages("withr")
  withr::with_dir(
    new = folder,
    code = source(script_path)
  )

  # 写法2:不想装第三方包就用自带的异常兜底逻辑
  # tryCatch({
  #   setwd(folder)
  #   source(script_path)
  # }, error = function(e) {
  #   warning(paste(script_path, "运行失败:", e$message))
  # }, finally = {
  #   # 无论脚本运行成功/失败,都切回初始工作目录
  #   setwd(origin_wd)
  # })
}
注意要点
  • 循环内不要直接调用无兜底的setwd():一旦脚本运行报错、或脚本内部修改了工作目录,后续所有循环的路径都会失效。
  • 路径拼接优先用内置函数file.path():手动拼接斜杠容易出现斜杠重复、遗漏的问题,file.path()会自动适配当前操作系统的路径规则。
  • 遍历文件夹时优先取绝对路径:list.dirs设置full.names = TRUE直接返回完整路径,不会因为工作目录变动出现文件找不到的问题。
  • 增加异常判断和捕获:单个子文件夹的脚本运行出错时,不会直接终止整个循环,剩余文件夹的脚本可以继续执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:45:31