如何在R中结合sprintf与通配符使用write.table函数
R中write.table结合通配符自动识别目标文件夹的问题解决
问题场景
已实现用for循环+sprintf为每个被试保存文件到指定路径,但现在每个被试目录下都有一个唯一的、以test-开头后跟数字的文件夹(如subject_001/test-1908、subject_002/test-143),希望用通配符自动识别该文件夹并保存文件,之前的尝试出现错误。
原工作代码
subjectlist = c("001") for (subs in subjectlist){ test <- cbind(3,2,1) write.table(test, file = sprintf("/home/subject_%s/test-1908/test.txt", subs)) }
这段代码会将test变量保存到/home/subject_001/test-1908/路径下。
尝试的错误代码及报错
尝试结合Sys.glob与sprintf实现通配匹配:
write.table(test, Sys.glob(file = (sprintf("/home/subject_%s/test-*/test.txt", subs))))
出现错误:
Error in if (file == "") file <- stdout() else if (is.character(file)) { : argument is of length zero
问题原因
Sys.glob是用来匹配已存在的文件/文件夹路径的,你直接拼接了不存在的test.txt,导致Sys.glob返回长度为0的空向量,write.table无法识别无效的file参数。
解决方案
正确逻辑是先匹配到test-开头的文件夹,再拼接要保存的文件名,同时增加路径有效性检查:
完整修改代码
subjectlist = c("001", "002") for (subs in subjectlist){ test <- cbind(3,2,1) # 匹配当前被试下所有test-开头的文件夹 target_dirs <- Sys.glob(sprintf("/home/subject_%s/test-*", subs)) # 检查是否找到有效文件夹 if (length(target_dirs) > 0) { # 若每个被试只有一个目标文件夹,直接取第一个;多个的话可添加筛选逻辑 target_dir <- target_dirs[1] # 用file.path拼接路径,适配不同系统 save_path <- file.path(target_dir, "test.txt") # 执行保存,可根据需求调整write.table的其他参数(如row.names等) write.table(test, file = save_path) } else { # 未找到时给出警告提示 warning(sprintf("被试%s未找到test-开头的目标文件夹", subs)) } }
补充优化
- 如果被试下可能存在多个
test-开头的文件夹,可按文件夹创建时间取最新的:
# 按创建时间降序排序,取最新的文件夹 target_dir <- target_dirs[order(file.info(target_dirs)$ctime, decreasing = TRUE)][1]
- 使用
file.path拼接路径,避免手动写/带来的跨系统兼容问题。
内容的提问来源于stack exchange,提问作者AFM
相关产品推荐
相关产品推荐

