在 R 中使用 write.table 函数和带通配符的 sprintf

问题描述 投票:0回答:1

我想使用 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

我该怎么做?

r printf wildcard placeholder write.table
1个回答
0
投票

括号中很少有拼写错误(或一些混乱),因此也许尝试在单个表达式中嵌套更少的调用,但这里的主要问题是您似乎期望

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

© www.soinside.com 2019 - 2024. All rights reserved.