平,
我有一个循环,我想根据条件运行以分隔多个表中的文件。基本上我采用psms表中的每个唯一文件名,并将这些行分成单独的文件。
writeCSVTables <- function(files, psms){
for(i in length(files)){
name <- tools::file_path_sans_ext(files[i])
write.table(psms[grep(name, psms$file), c("accession", "sequence", "peptide",
"modif", "fixed", "file", "spectrum")],
paste(name,".corr.csv", sep =""), sep ="\t", row.names = FALSE, quote = FALSE)
}
}
我的问题是循环只对第一个文件名运行一次,然后退出就好像它成功了。我查看了文件向量,它确实包含2个唯一的文件名,因此循环应该运行两次。任何建议的离子?
答案 0 :(得分:4)
如果length(files)
为2,那么你的for循环遍历1元素向量,其唯一元素为2.
无论如何 - 为什么要使用指数?只需直接遍历文件名。
替换
for(i in length(files)){
name <- tools::file_path_sans_ext(files[i])
通过
for(fname in files){
name <- tools::file_path_sans_ext(fname)
答案 1 :(得分:2)
尝试改为
[...]
for(i in seq(length(files))){
[...]
符号for(i in length(files))
表示变量i
将迭代地假设其旁边的向量中的所有值。 length(files)
是单个值,因此它只运行一次,然后退出。按设计工作。
您可能想要的是for(i in seq(length(files)))
。在此,i
假定seq(length(files))
中的每个值(即 1
,2
,3
,...,{{1迭代地。
其他解决方案也可以更好地利用矢量化。