Rのファイルとディレクトリの操作に用いる関数は、なぜかflockが標準サポートされていませんが、統計解析用途と考えると過剰気味に用意されています。バッチ処理において困ることは無いでしょう。一度に全部は覚えきれないでしょうが、以下の関数を覚えておくエンドユーザー・プログラミングで不足することは少ないと思います。
カレントディレクトリを確認
オプションによって初期ディレクトリは変わるので、これは覚えておきましょう。
カレントディレクトリを移動
これもよく使うことになると思います。
setwd(file.path("C:", "Program Files"))
setwd(Sys.getenv("HOME"))
ファイルパスの一部分を得る
ファイルとディレクトリの操作では必要となります。正規表現などで間に合わせがちですが、拡張子がないときの処理を忘れてしまったりするので、これらを使いましょう。
filepath <- "/home/uncorrelated/docs/example.csv"
# 拡張子以外を得る
(sans_ext <- tools::file_path_sans_ext(filepath))
[1] "/home/uncorrelated/docs/example"
# 拡張子を得る
(ext <- tools::file_ext(filepath))
[1] "csv"
# ファイル名を得る
(filename <- basename(filepath))
[1] "example.csv"
# パスを得る
(path <- dirname(filepath))
[1] "/home/uncorrelated/docs"
省略形をフルパスにする
ドットやチルダをつかったファイルパスはそのままでは扱いづらい事がありますが、正規化されたフルパスに変更できます。
fullpath <- normalizePath(".")
ファイル一覧を得る
オプションは多いので?dirで確認しながら使いましょう。
# カレントディレクトリのファイル一覧
dir()
# 正規表現で絞る
dir(pattern = ".*[.]txt$")
# ディレクトリの一覧を出す
list.dirs(recursive = FALSE)
# ワイルドカードを用いる
Sys.glob("*.csv")
Sys.glob(file.path(R.home(), "library", "*", "R", "*.rdx"))
ファイルの存在を確認する
バッチ処理などでは入れておいた方がよいです。
file.exists("example.csv")
ファイルの情報を得る
file.infoとfile.modeがあれば足りるのですが、他にもあります。
# ファイルの情報を得る
file.info(fname)
# 更新日時(file.infoでも出る)
file.mtime(fname)
# サイズ(file.infoでも出る)
file.size(fname)
# アクセス制限(BSD UNIX準拠)
file.mode(fname)
OSにコマンドを実行させる
systemでOSのコマンドを実行させられます。これでディレクトリをつくったり、ファイルコピーをしたりもできます。
# シェルの`echo`を呼び出す
system("echo \"Hello, Shell!\"")
ファイルをコピーする
file.copy("example.csv", "example_copied.csv")
ファイル名を変更する
file.rename("example_copied.csv", "example02.csv")
Sys.chmodでファイルの属性を変更したり、Sys.setFileTimeでファイルの日時を変更したりもできます。
ファイルもしくはディレクトリを削除する
unlinkでファイルとディレクトリを消去できます。recursive = TRUEをつければ、入っているファイルごとディレクトリを消去できます。file.removeと言うのもあります。
ディレクトリをつくる
存在するディレクトリを作ろうとすると警告が出るので、警告を出なくするか、存在しないことを確認しておいたほうが心理的によいです。
# 警告を抑制
suppressWarnings(dir.create("newdir"))
# 存在しないことを確認してから作成
mkdir <- function(dname){
if(!dir.exists(dname)){
dir.create(dname)
}
dname
}
newdir <- mkdir("newdir")