R 一括処理 - eiichiromomma/CVMLAB GitHub Wiki

(R) 一括処理

特定のファイルを一括して処理する作業

ディレクトリ階層

Rを作業ディレクトリとして以下のような階層を用いる。

R
|-- myfunction.R
|-- GroupA
|   |-- a-01.jpg)
|   |-- a-02.jpg)
|   |-- a-03.jpg)
|   |-- a-04.jpg)
|   |-- a-05.jpg)
|   `-- table.csv
`-- GroupB
    |-- b-01.jpg)
    |-- b-02.jpg)
    |-- b-03.jpg)
    |-- b-04.jpg)
    |-- b-05.jpg)
    |-- b-06.jpg)
    |-- b-07.jpg)
    |-- b-08.jpg)
    `-- table.csv

table.csvは各画像に関する撮影地点等のデータを入れる。例えば、

filename,Name,Place,From,To
a-01.jpg),GroupA,x-1,20,23
a-02.jpg),GroupA,x-2,25,30
a-03.jpg),GroupA,x-2,38,50
a-04.jpg),GroupA,x-2,100,110
a-05.jpg),GroupA,x-3,111,120

とする。

グループ内を一括処理

グループ名gnameを引数とする関数を作り、

filelist <- list.files(path=fname,pattern=".jpg)")
imagelist <- read.csv(sprintf("%s/table.csv",fname))

とするとfilelistはファイル名が列挙されたベクトルになり、imagelistはcsvに並んだ通りのデータフレームになる。 二つのデータの関連付けは

imagelist[imagelist$filename==filelist[k],]$Place

と指定するとfilelist[k]に該当する画像のPlaceが得られる。

グループも一括処理

"ディレクトリだけ"という指定はできないので、グループ名の付け方を工夫する必要がある。 例の構成であれば

grouplist <- list.files(pattern="Group")

とすればディレクトリのリストが得られる。 そのリストをループでグループ内処理の関数に渡せば良い。

list.filesの引数recursiveをTRUEとすれば作業を分けずに行なえそうだが、考えるのが面倒なので分業にした。