niszetの日記

細かい情報を載せていくブログ

(R) fsパッケージでpathまわりを使いこなしたい (2回目)

fsパッケージのpathまわりの関数の話の続き

前回の続き。

niszet.hatenablog.com

path_home(), path_home_r()

path_expand()path_expand_r()~を展開したファイルパスを返してくれましたが、これは引数無しならホームディレクトリを、引数があればその階層構造を示したファイルパスを絶対パスで返します。

path_home("aaa", "bbb", "ccc")
#> C:/Users/niszet/aaa/bbb/ccc
path_home_r("aaa", "bbb", "ccc")
#> C:/Users/niszet/Documents/aaa/bbb/ccc

path_join()

与えられた文字列を"/"で結合してパスを返してくれます。与える文字列はc()でベクトルとして渡す必要がある。

path_join(c("aaa/bbb", "ccc", "ddd"))
#> aaa/bbb/ccc/ddd

path_norm()

連続した/と末尾の/を取り除き、や...を解釈してスッキリしたファイルパスをfs_pathオブジェクトとして返してくれる。連続した/path()でも削除してくれる。

path_norm("hoge/..//.///fuga/")
#> fuga
path("hoge/..//.///fuga/")
#> hoge/.././fuga

path_package()

インストールしたパッケージのファイルパスを返してくれる。

path_package("base")
#> C:/PROGRA~1/R/R-35~1.1/library/base

path_real()

シンボリックリンクがある場合、それのリンク先(実体の方)のパスを返してくれる

## a/ ディレクトリを作成
#> dir_create("a")

## aの下にbというファイルを作成
#> file_create("a/b")

## cという名前でaに対してシンボリックリンクを作成
#> link_create(path_abs("a"), "c")

## cの下のb
path("c/b")
#> c/b

# path_realでシンボリックリンクのリンク先のパスが返ってくる
path_real("c/b")
#> C:/Users/niszet/Documents/r work/test4blog/a/b

path_rel()

相対パスを返す。どこからの相対パスにするかはstart引数で制御。デフォルトはカレントディレクトリ(.)

fs::path_rel(path = "C:/hoge", start = ".") 
#> ../../../../../hoge

path_sanitize()

WindowsLinux上で問題になりそうな文字列を削除してくれる。動きは下記のページに書かれている"Details"を読むと良さそう。 www.npmjs.com

ただ、/も消されるのはそういう動きで良いのだろうか…?本家?もその動きだから良いのかな。

path_sanitize("a/../b")
#> [1] "a..b"

path_split()

与えられたパスを"/"で分離する。戻り値はリストになる。

path_split(c("aaa/bbb/ccc", "ddd/eee/fff"))
[[1]]
[1] "aaa" "bbb" "ccc"

[[2]]
[1] "ddd" "eee" "fff"

path_temp()

一時ディレクトリを作成する。file_temp()で一時ファイルを作るとこのdirの下にできるようだ。中間ファイルとかで作業dirを汚したくない時などに使いやすそうですね。

path_temp()
#> C:/Users/niszet/AppData/Local/Temp/RtmpWexlCk

## 実際に存在することを確認
file_exists("C:/Users/niszet/AppData/Local/Temp/RtmpWexlCk")
#> C:/Users/niszet/AppData/Local/Temp/RtmpWexlCk 
#>                                          TRUE 
## 
path_temp("hoge")
#> C:/Users/niszet/AppData/Local/Temp/RtmpWexlCk/hoge

path_tidy()

untidyなパスの表記をtidyにしてくれる。階層の区切り文字は"/"で、末尾には"/"がつかない。path_real()path_norm()のような処理はせずに、tidyなpath表記にしてくれるだけ。

path_tidy("aaa\\bbb///ccc/../../")
#> aaa/bbb/ccc/../..

ということで、一応これでpath_**の関数たちを列挙できました。

Enjoy!!