我想使用 R 中的 write.table 保存 .txt 文件。该文件需要使用占位符和通配符。
我已成功使用 for 循环和 sprintf 命令循环遍历主题并为每个主题保存文件。例如:
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/ 中的文件。
现在,我想更新脚本以写入更多文件,但是,因为在每个主题的文件夹中,都有一个以“test”开头但以唯一编号结尾的文件夹(例如,subject_001/test-1908、subject_002 /test-143等),我想使用通配符,这样无论测试编号是什么,脚本都知道将文件保存在以“测试-”。
我尝试将 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()
找到尚不存在的文件。
为 reprex 准备目录树:
root_p <- fs::path("so-79210566")
fs::dir_create(c(
root_p / "subject_001" / "test-1908",
root_p / "subject_002" / "test-143"
))
fs::dir_tree(root_p)
#> so-79210566
#> ├── subject_001
#> │ └── test-1908
#> └── subject_002
#> └── test-143
构建通配符模式,然后找到与
Sys.glob()
匹配的内容,然后构建最终文件路径;更喜欢 file.path()
来构建路径:
root <- "so-79210566"
subjectlist <- c("001", "002")
for (subs in subjectlist){
test <- cbind(3,2,1)
test_glob <- file.path(root, sprintf("subject_%s", subs), "test-*")
message("test_glob: ", test_glob)
# keep the 1st match
test_dir <- Sys.glob(test_glob)[1]
message("test_dir: ", test_dir)
write.table(test, file = file.path(test_dir, "test.txt"))
}
#> test_glob: so-79210566/subject_001/test-*
#> test_dir: so-79210566/subject_001/test-1908
#> test_glob: so-79210566/subject_002/test-*
#> test_dir: so-79210566/subject_002/test-143
生成的目录树:
fs::dir_tree(root_p)
#> so-79210566
#> ├── subject_001
#> │ └── test-1908
#> │ └── test.txt
#> └── subject_002
#> └── test-143
#> └── test.txt
创建于 2024 年 11 月 22 日,使用 reprex v2.1.1