在R中使用循环批量绘制多个文件

3
我有5个名为"1.txt","2.txt",...,"5.txt"的标签文件。每个文件都包含一个名为"x"的列和另一个名为"y"的列。 我想应用循环来生成每个文件的图,并将图重定向到相应的输出pdf文件,分别称为"1.pdf","2.pdf"等。 这是我尝试过的,但我想PDF部分可能存在问题:
files<-list.files(pattern=".txt")
for (input in files){
   output<-basename(file.path(input,fsep=".txt"))     # input files are in working directory
   graph<-read.table(input,header=T)
   pdf('output.pdf')
   plot(graph$x,graph$y)
   dev.off()
} 

它只生成名为“output.pdf”的第一个图表。

我该如何在pdf函数中提到变量“output”?

感谢您的帮助!


我不确定你是否建议使用粘贴,因为我的文件名为“1”,“2”,“3”,“4”,“5”。我提到这些名称只是作为示例。我的意思是将输出文件与相应的输入文件具有相同的前缀命名。 - lqdo2000
我的建议与你特定文件的具体名称无关,它只是解决这个问题所需的工具。 - joran
2
让我们思考一下:output包含您希望重用的输入文件名部分。我们必须向pdf()传递一个字符值来命名文件。paste允许我们将几个字符串组合成一个字符串... - joran
1个回答

4
在增加教学术语的情况下,Joran想表达的是您当前的函数会覆盖您的output.pdf五次。我希望你能学会自己捕鱼。您必须向pdf()传递一些内容以生成五个唯一的文件。类似以下内容可能有所帮助:
files <- list.files(pattern=".txt")
for (input in files){
   output <- basename(file.path(input,fsep=".txt")) 
   graph  <- read.table(input,header=T)
   pdf(paste0("output for ", input,".pdf"))
   plot(graph$x,graph$y)
   dev.off()
} 

快要成功了。我尝试了很多组合。最好的是当我用 pdf(paste0(output,".pdf")) 替换时,它生成了文件,但 ".txt" 扩展名仍然存在("1.txt.pdf")。我尝试修改 file.path 函数,但没有任何变化。它还返回 Error in read.table(input, header = T) : more columns than column names。我也尝试使用 paste 而不是 paste0,但结果相同。图表是正确的! - lqdo2000
要去掉“.txt”使用:output_notxt = sub(".txt", "", output),这实际上是将“.txt”替换为空字符串。 - Paul Hiemstra
1
@lqdo2000 basename 运行良好。它“删除所有路径,包括最后一个路径分隔符(如果有的话)”。它的文档没有提到删除文件扩展名。 - joran
@lqdo2000,我同意joran的看法,你需要阅读文档。 - Eric Fail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接