2016-11-10 12 views
0

私はRに慣れています。いくつかの実験データを処理しようとしましたが、ファイルを読むときにバグが残っています。 フォルダ内のいくつかのデータファイルを読みたいと思っていますが、そこにいくつのデータファイルがあるのか​​分かりません。私はすべてのファイルの名前が「Subject1ManualX.log」で、Xが1以上であることを知っています。フォルダ内にいくつのファイルがあるのか​​分からないので、例外が発生するまで(つまり、 "Subject1Manual1.log"、次に "Subject1Manual2.log"を開こうとするまで、whileループでファイルを開こうとします。等)。 R - 未知数のファイルを読む

# Script to work on ET data 
temp <- 0 

while (temp == 0){ 
    tryCatch({ 
    subjectData <- read.delim("D:/Doctorat/XPs/XP1-2_LIPSMWA/SmartEye/Subject1/Subject1Manual3.log") 

    }, warning = function(w){ 
    print(paste("warning", i)) 
    temp <- 1 

    }, error = function(e){ 
    print(paste("error", i)) 
    temp <- 1 

    }, finally = { 
    print("finished") 
    }) 
} 

は、残念ながら、それは(...私がここにいる理由です)動作しません。

は、ここに私のコード(プリントは、デバッグのためのものである)です。私は警告と間違いがあることを知っている。警告を処理すると、エラーが処理されないため( "すべての接続が使用中"のクラッシュ)Rがクラッシュします。私がエラーだけを処理する場合、エラーは処理されず、各繰り返しでwhileループが続行されます。

この問題に関するアイデアは非常に高く評価されます(未知数のファイルを読み込むためのより良い方法を含む)。あなたの時間をありがとう!

Pyxel

編集:[OK]をいくつかの素晴らしい人物が複数のデータファイルをインポートする方法を答えたが、好奇心のために、私はwhileループ内のtryキャッチに対処する方法を知っていただきたいと思います。何か案が? tryCatchしばらくして

+0

使用' list.files'機能... ..... – drmariod

答えて

1
# Here we read path to all '*.log' files in folder 
path_to_files = dir("D:/Doctorat/XPs/XP1-2_LIPSMWA/SmartEye/Subject1/", 
        full.names = TRUE, 
        recursive = TRUE, 
        pattern = "\\.log$") 

# further we read all files to list 
files = lapply(path_to_files, read.delim) 

# and finaly we combine files to single data.frame 
# headers of files should be identical 
res = do.call(rbind, files) 

UPDATEコード。それは安全ではなく、ループ内でdata.frameが大きくなります。悪い習慣です。

subjectData = TRUE 
i = 1 
res = NULL 
while (!is.null(subjectData)){ 
    subjectData <- tryCatch({ 
     read.delim(sprintf("D:/Doctorat/XPs/XP1-2_LIPSMWA/SmartEye/Subject1/Subject1Manual%s.log", i)) 

    }, warning = function(w){ 
     print(paste("warning", i)) 
     NULL 

    }, error = function(e){ 
     print(paste("error", i)) 
     NULL 

    }) 
    if(is.null(res)){ 
     res = subjectData 
    } else { 
     res = rbind(res, subjectData) 
    } 
    i = i + 1 
} 
これは、ループや、これまでどのような簡単にそれらを処理するために使用されることができる特定のファイルを選択するために、すべてのファイル、ユーザー `pattern`を取得する
+0

感謝あなたは、この "dir"機能を見つけられないために間違ったキーワードを使用したと思います。私はあなたのソリューションを試して、それは完全に動作します。 whileループでtrycatchを処理する方法はありますか? – Pyxel

+0

@Pyxel更新を参照してください。しかし、私はこのコードを使用することはお勧めしません。 –

+0

>ありがとうございました!あなたの最初の解決策が間違いなくきれいなので、私はそれを使用しませんが、私は最初の問題を解決する方法が不思議でした。 – Pyxel

関連する問題