R语言优化目录文件查找while循环:能否省略后续判断语句?
向上遍历目录查找文件的代码简化方案
需求:从当前工作目录及其所有父目录中查找指定文件,找到第一个匹配项即停止;若遍历到根目录仍未找到,打印“Root directory reached”并退出。现有代码在循环后额外加了if判断是否找到文件,希望简化代码,省略该if语句,或找到更简洁的写法(尝试的while-else写法无法生效)。
原代码
dir <- getwd() while( !file.exists(paste0(dir, "/my.file")) ) { if(dir == "/") { print("Root directory reached"); break } dir <- dirname(dir) } if(file.exists(paste0(dir, "/my.file"))) print(dir)
尝试的无效简化写法
dir <- getwd() while( !file.exists(paste0(dir, "/my.file")) ) { if(dir == "/") { print("Root directory reached"); break } dir <- dirname(dir) } else print(dir) # 此写法无效
可行的简化方案
方案1:将判断与输出整合到循环内,彻底省去循环后的if
直接在循环里处理两种终止情况:找到文件则打印路径并退出;到根目录则打印提示并退出,无需额外判断。同时推荐用file.path()替代paste0(),它能自动适配不同系统的路径分隔符,兼容性更好。
dir <- getwd() while(TRUE) { target_file <- file.path(dir, "my.file") # 找到文件,打印路径并退出循环 if (file.exists(target_file)) { print(dir) break } # 到达根目录仍未找到,打印提示并退出 if (dir == "/") { print("Root directory reached") break } # 向上遍历父目录 dir <- dirname(dir) }
方案2:用标志变量替代循环后的重复判断
如果不想改变循环结构,可以用一个布尔变量记录是否找到文件,避免循环后重复执行file.exists()判断:
dir <- getwd() found_file <- FALSE while( !file.exists(file.path(dir, "my.file")) ) { if(dir == "/") { print("Root directory reached") break } dir <- dirname(dir) # 循环结束后检查是否找到,更新标志 if (file.exists(file.path(dir, "my.file"))) { found_file <- TRUE } } if (found_file) print(dir)
为什么while-else写法无效?
R语言中while循环没有else语法,只有if-else、for-else(for循环的else块仅在循环正常结束、未被break中断时执行)。所以在while后直接加else会触发语法错误,这就是你尝试的写法失效的原因。
内容的提问来源于stack exchange,提问作者Pål Bjartan
相关产品推荐
相关产品推荐

