2016-11-25 9 views
0

こんばんは、私は以前、機器によってバッチで生成されたすべての.txtファイルから一つの異なるプロットを生成Rスクリプトを作成しようとしていますバッチ複数のプロット

、と同じでありスクリプトのフォルダ。

私は非常にRとプログラミング全般(現在まで1〜2ヶ月)で非常に劣っています。

.txtファイルには、それぞれV1とV2の2つの列があり、ヘッダーはありません。

  • 私はフォルダ内のすべてのtxtファイルのリストを取得:コードを生成する前に

    ``` 
    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ファイルだけを出力します。
  • "speed"という名前の.txtファイルのみを選択します。
  • I 1ザ・ループなら
  • Iの値を代入する:iが選択されたファイル
    • の番号i = 1のファイル選択のI ^番目のファイルを(読み取りより< =である場合、最初のファイル)
    • 私はそれを私が私がNEX 1.

により増加したディレクトリ

  • を保存するプロットを作りますt roundはi = 2で始まります。

    問題は、ループが "Speed_selection"のすべての長さを通過していないので、私は1つのプロット(最初のファイルに対応する)を取得するだけです。

    私は間違っていますか?

    ありがとう、

    お待ちしております。

  • +0

    あなたは、単一の出力を取得するつもりだので、それは、「plot.pdf」一つ一つの時間を上書きするループを持っていた場合。ループを実装するには、最初に「for」を持つ必要があります。また、 'ggsave'が達成された後、' p < - plot(V2〜V1、Speed、 "l") 'とは何ですか? –

    +0

    お返事ありがとうございます。私はそう思っていましたが、選択リストの最初のファイルをプロットしているだけで、2番目のファイルではありません(上書きの結果として発生するように)... 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

    フードの下では、 'purr'は' 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

    でそれを修正申し訳ありません、これは私に次のエラーを与えた: "エラー:'デバイス 'はNULL、文字列または関数でなければなりません。 – Mollan

    +0

    私は 'ggplot2'オブジェクトとファイル名を明示しませんでした。今はどう? – boshek

    +0

    はい、ありがとうございます。今それは動作します。ファイル名に問題があったが(名前に0.5が入っていた)、事前にそれを知ることはできなかった。もう一度、助けてくれてありがとう!もちろん、 – Mollan

    関連する問題