2016-11-25 74 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