niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) Rでファイルを扱うfsパッケージを使う (1回目)

とりあえず触りだけ…

さて、r-libには色々と便利なパッケージがあるのでたまに覗いてみると新しいパッケージがあったりして(たとえばioパッケージとか)面白いですね。ということで、今回は(長らく放置していた)fsパッケージの話です。
内容はREADMEの適当な訳みたいになってます。

fsパッケージとは

GitHubのレポジトリはここ github.com

CRANにも上がっています1。Rにはファイルを取り扱う関数は色々あるけれども、例によって関数名に統一感がなかったり2、OS、プラットフォーム毎に出力結果が異なったり、明示的なエラーを返さない3など色々と使い勝手が悪いところがあったようです。それをこのfsパッケージではプラットフォーム間の違いを吸収したり、エラーを明示的に返したり、関数名を整然とさせたようですね。詳しくは上記のリンク先のREADMEに書いてあるので読んでみてください。 とはいえ、ファイル操作系の関数はあまり使ったことがないので使っていって慣れていくかな…。

fsパッケージを使うメリット

これもREADMEに書かれている通りですが、 * 全てのfsの関数はベクトル化されている(旧来の関数はそうではないのか) * 全てのfsの関数はパスの文字列のベクトル、パス名と同じ名前付きの整数か論理型のベクトルを返す。(旧来のは論理ベクトルやエラーコードを返すらしい) * 明示的にエラーを返す。(旧来のものはwarningを返したりOS依存のエラーコードを返すらしい) * UTF-8を常に使うようになったようです。受け取ったものはUTF-8に変換するし、返すときもUTF-8。旧来のモノはOSに依存した文字コードを返すようですね * 関数のネーミングルールがわかりやすくなっています。(例として、path.expand() vs normalizePath(); Sys.chmod() vs file.access()があげられていました。確かに全然わからん)

みたいなことが書かれていますね。RのOS依存の動きってのが結構きつくて、先日もwriteLines()UTF-8のファイルをWindows上で出力しようとして辛さを感じました(解決済みですが)

パスについて

READMEにはTidy Pathsって書いてありますね。はいはい、tidy,tidyといった気持ち4。 ファイルパスの区切り文字5には常に/を使うようです。\は使わない。あと//とかにもならない…らしい。
あと、ファイルの種類やパーミッションによって色が変わるらしい(ただし、ターミナルがサポートしていればという条件あり)

使い方

対象としているファイルの種類によって関数名の最初の文字が変わるように作られています。これはRのコンソール上での補完をするときに便利かもしれません。 * path_ はパスの操作に * file_ はファイルの操作に * dir_ディレクトリに * link_ はリンクにそれぞれ対応している。

実際に使ってみる

READMEはまだ続きますが、実際に使ってみた方がわかるだろうということで。

library(fs)

# linuxのlsコマンドと同じようにカレントディレクトリに存在するファイルを返す。
dir_ls()
#> fs_test.Rproj

# Rディレクトリを作成する
fs::dir_create("R")

# 出来たことを確認。ファイルの種類やパーミッションなどで色が変わるので便利(winだとパーミッションとは…?状態)
dir_ls()
#> fs_test.Rproj R             

# ディレクトリ下にファイルが存在しない場合はcharactor(0)が返ってくる
dir_ls("R")
#> character(0)

# Rディレクトリ下にファイルを作成する
fs::file_create("R/hoge.txt")

# 出来ていることを確認。
dir_ls("./R")
#> ./R/hoge.txt

# カレントディレクトリを変更する
setwd("R")

# R/がカレントディレクトリなので、dir_lsの結果はR/下のファイル
dir_ls()
#> hoge.txt

# 今いるディレクトリに依らずに、プロジェクトのファイルを参照したい場合はhere::here()と組み合わせる
# ただし結果はfull pathになる。
dir_ls(here::here())
C:/Users/niszet/Documents/r work/fs_test/fs_test.Rproj C:/Users/niszet/Documents/r work/fs_test/R   

# path_file() で囲うとファイル名だけを取り出せる。
path_file(dir_ls(here::here()))
fs_test.Rproj R      

と、ファイル処理なので無限に例が書けますね…。基本的にlinuxで使っているコマンド群になれていれば、それに対応する関数があるはずなので、あまり違和感なく使えるのではないか?と思います。

個人的には何気にpath_系がかなり便利な気がします。

今回は触りだけでしたが、このパッケージ使えるようになるとコンソールから動かずにファイル処理が出来てとても良いです。画期的。

ファイル名に色が着くことはてなブログでは表現できないので、適当にggbode作業dirのキャプチャ画面でも6。環境に依っては色が違うかもしれませんね。これもどこかで設定できる(か、上書きして乗っ取ることが出来る)はず。 f:id:niszet:20180430163230p:plain

RとRmd、pngとjpgがそれぞれ同じような色分けになっていたり、ディレクトリや圧縮ファイルも色付けされているものの、exeやpdf、ショートカットファイルであるlnkなどは色づかないことから、多分内部で拡張子毎に色付けをしているのですね。が、対応するコードを見つけられず。どこにあるんだ…。

2回目はいつになるかなぁ…

Enjoy!!


  1. そういえばGitHub版はdevtoolsじゃなくてremote使った方が格好良かったりする?

  2. 後から必要に応じて関数が追加されていったという歴史的背景があるようですが…

  3. あってるかな・・・

  4. 最近はもうtidy疲れって言わなくなりましたか…?

  5. 何て呼ぶのが良いのか…

  6. ファイル名については突っ込まないで…。