niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

Rでバイナリファイルを読む、readBinについて

Rでバイナリファイルを読む

さて、read_wavはwaveファイルを読むのですが、当然?wavファイルはバイナリデータです。
つまり、Rでバイナリファイルを読むための知見が必要なのですが、あまりそういう需要がないためか、情報もあまりないのでした。

readBin

こちらを大変参考にさせていただきました。 blog.recyclebin.jp

最終的にはかなり違うものになりましたが。

Rプログラミングマニュアル[第2版]ならreadBinについて記載があるかなと思ったのですが、残念ながら「ヘルプを読みましょう」と書かれていましたので、ヘルプとにらめっこです。 株式会社サイエンス社 株式会社新世社 株式会社数理工学社

readBinのヘルプ

readBinのヘルプを読みます。 引数で何が与えられるのか、デフォルト値が何で決まっているのか(環境依存とか)、サンプルプログラムとか、色々情報が詰まってますね。
本文は最初は読んでもよくわからないことが多いですが…末尾のプログラムが動かなかったことはなかったはず。

R: Transfer Binary Data To and From Connections

さて、readBinはこんな感じの引数(とデフォルト値)を持っていますね。

readBin(con, what, n = 1L, size = NA_integer_, signed = TRUE,
        endian = .Platform$endian)

conにはコネクションを与えます

  connection <- file(file, "rb")

こんな感じでファイル名fileをバイナリモードのreadモードで開く形です。

whatには型を与えます。wavの場合は"integer"で良いです。"WAVE"などが入っている箇所はreadCharで読めばよいので。

signedは16bitPCMの場合は符号ありなのでTRUE。8bitの場合はFALSEにしないといけませんね。A.I.に追加。

endianはデフォルト値が入っているのですね。"little"を明示的に与えた方が良いのかもしれませんね。A.I.に追加。

sizeはそれぞれの読み込みのサイズをバイト数で与える形です。16bitなら2を与えればよいわけですね。
nは連続して読み込む場合に指定。wavファイルは固定長のデータのため、データ部分は一括で読み込むことが出来ます。

最初はfor文で読んでいましたが、Rのforは遅いので。ファイルサイズが小さい場合は問題にならないと思います。
可変長の場合は考えなくてはならないですが、それは次のread_smfにて考え中。

コネクションは最後に必ず閉じておく必要があります

close(connection)

が、エラーがあるとcloseが実行されなくなってしまうので、on.exit()に入れておく方が良いですかねぇ。これもA.I.…。

on.exit()

実際使ってみるのが、理解するには一番の近道な気がします。バイナリエディタとにらめっこして、思った値が取れているか?を地道にチェックすると良いのです。

read_wavの「完成」はまだまだ先になりそうですね…