2016-11-25 77 views
0

晚上好,批量多条曲线

我努力使产生从每一个txt文件,已在一批由仪器之前生成一个不同情节的R脚本,并在同一脚本的文件夹。

我很不熟悉R和编程(一般1-2个月的练习)。

.txt文件有两列,V1和V2,没有标题。

这里是我已经生成的代码:

``` 
library(tidyverse) 
library(ggsci) 

fileNames <- list.files(getwd(), full.names = T, pattern="txt") 
#print(fileNames) 

Speed_selection <- grep('speed', fileNames, value=TRUE) 

length <- length(Speed_selection) 

i <- 1 

if(i<=length){ 
    #print(Speed_selection[i]) 
    Speed <- read.table((Speed_selection[i]), header=F, sep="") 

    p <- ggplot(Speed)+geom_line(aes(V1,V2)) 
    ggsave("plot.pdf", p) 

    i=i+1 
    i 
} else { 
    print("Finished") 
} 
``` 

我生成的代码之前的想法是以下几点:

  • 我得到一个文件夹中所有txt文件的列表。我检查列表,它只打印txt文件。
  • 我只选择名称中包含“速度”的.txt文件。
  • 我的1的值分配给我
  • 的如果循环:如果i < =除了所选择的文件
    • 读取在文件选择第i ^个文件的数目(其中i = 1 ,第一个文件)
    • 我做的情节我保存的目录
    • 我用1

所以NEX增加我t轮将从i = 2开始

问题是,我只得到一个绘图(对应于第一个文件),因为循环没有经过“Speed_selection”的所有长度。

我在做什么错?

感谢您的帮助,

最好的问候。

+0

如果你有一个循环,将覆盖“plot.pdf”每一次,所以你只会得到一个输出。你需要在开始时使用'for'来实现循环。另外,'ggsave'完成后'p < - plot(V2〜V1,Speed,“l”)'是什么? –

+0

谢谢你的回复。我认为是这样,但它只是绘制选择列表中的第一个文件,而不是第二个文件(因为它将作为覆盖的结果而发生)......也感谢您在ggsave之后的绘图上的修正。我试图看看正常情节功能是否能解决问题。我在原文中更正 – Mollan

回答

0

这里是因为你已经在使用tidyverse使用辅助功能和purrr的方法。

library(tidyverse) 
library(ggsci) 

print_plots <- function(x) { 

    data <- read.table(x, header=F, sep="") 

    file_name <- sprintf("%s plot.pdf", basename(x)) 

    p <- ggplot(data) + 
     geom_line(aes(V1,V2)) 

    ggsave(file_name, p) 

} 

fileNames <- list.files(getwd(), full.names = T, pattern="txt") 

Speed_selection <- grep('speed', fileNames, value = TRUE) 

walk(Speed_selection, ~print_plots(.x)) 

或烟斗:

list.files(getwd(), full.names = T, pattern="txt") %>% 
     grep('speed', ., value = TRUE) %>% 
     walk(Speed_selection, ~print_plots(.x)) 
+0

这工作完美,我不知道为什么。回到课本...感谢您的帮助! – Mollan

+0

在引擎盖下,'purrr'使用'apply'系列函数。这些函数将为列表/矢量的每个元素应用另一个函数。 'walk'功能使用'sapply',但是没有输出到环境中。本质上,它通过文件列表来遍历函数,并且'print_plots'辅助函数的副作用会将图形写入pdf文件。 –

1

看来你似乎过分复杂了。下面不会做同样的事情吗?

for(x in list.files(getwd(), full.names = T, pattern="\\.txt")) 
{ 
    Speed <- read.table(x, header=F, sep="") 

    p <- ggplot(Speed) + 
    geom_line(aes(V1,V2)) 

    ggsave(p,filename=paste0(gsub("\\..*","",x),"_plot.pdf")) 
} 
+0

对不起,这给了我以下错误:“错误:'device'必须为NULL,一个字符串或函数。” – Mollan

+0

我没有明确指出哪个是'ggplot2'对象,哪个是文件名。现在呢? – boshek

+0

是的,谢谢。现在它可以工作。有一个文件名称的问题(名称中有0.5),但事先不知道。再一次感谢你的帮助! – Mollan