未完放流

終わりなど無い、有るのは試練だけだ……

Rの中で ls command もどき

何か気持ち悪い。

コンピュータを使う時は“Small is Beautiful!”だろう。

「Rでディレクトリの中身とか調べるの?計算するためのものだろう! 他のことをやらせたら駄目だろう。」とRでweb server まで作れるご時世に偏見ともいえる考えが頭の中でこだまします。

R only な開発がベストなツールの作成が必要になったので、 普段ならbashを使うものを代替してみようと思います。

RでLinuxlsコマンドはどうやるんだろう備忘録。

ls

まず基本から

> dir()
[1] "dir" "fuga" "hoge"
> a <- dir()

ん?

> list.file()
[1] "dir" "fuga" "hoge"
> b <- list.file()

念のために比較

> a == b
[1] TRUE TRUE

何で2種類あるんだろう?返り値であるabも文字ベクター。 ちなみに"dir"ディレクトリ。ファイルと区別もつきません。

Helpを呼び出してみると併記してある。全く同じもの。どちらかがAliasですね。 両方とも{base}だし何でこんなになっているんでしょう?

Perlも似た機能を異なるパッケージで提供しているけれど、微妙に機能が異なっていたような…… 「同じものを違う名前で提供します」という割り切りは自分の中である種の新鮮さも感じます。 何か経緯があるのでしょうか?

ls -a

隠しファイルを見たい時

> list.file(all.files = TRUE)
[1] "." ".." "dir" "fuga" "hoge"     

何でこんなにタイプしないといけないんだよ。拷問ですか。 やはりUNIXコマンドは素晴らしいGeekのためにある、怠惰の極みだ。もう帰る。

コードにした時には分かり易いほうが良いので我慢しましょう。

ls -R

> list.files(recursive = TRUE)
[1] "dir/hoge2" "fuga" "hoge"

ま、こんなもんでしょ

ls hoge

マッチングですね。 “pattern"という引数があり正規表現も使えるようです。

とりあえず、

> list.files(pattern = "hoge")
[1] "hoge"

再帰的なものもいけます。

> list.files(pattern = "hoge", recursive = TRUE)
[1] "dir/hoge" "hoge"

この返り値は用途によっては良いかも。

ls *g*

ワイルドカードですね。

しかし、これが厳密には分かりません。 Rには正規表現の実装が2種類あるらしいですね。extended, Perl-like と書かれていますね。

shell script であれば

$ ls *g*
fuga hoge

Rだと

> list.files(pattern = "*g*")
[1] "dir" "fuga" "hoge"

??? どう解釈すれば良いのでしょう? やっぱり grep 周り&正規表現復習しよう。

ちなみに先のスクリプトと同じ結果を得るのなら

> list.files(pattern = "g")
[1] "fuga" "hoge"

多分、以下のコマンド同じ結果を解釈するべきなんでしょうね。

$ ls | grep g
fuga hoge

反省

自分の用途は計算メインなので何とかなってしまっているのですが、 問題が起きないから理屈が分からなくても良いというのは駄目ですね。

少し考え直そう。