web-dev-qa-db-ja.com

list.files()のようなディレクトリ内のディレクトリのリストを取得する方法で、代わりに「list.dirs()」

これは誰かにとって非常に簡単な質問かもしれません-list.files()を使用して特定のディレクトリ内のファイルのリストを取得できますが、ディレクトリのリストを取得したい場合、どうすればよいですか? list.files()内のオプションとして、どういうわけか私の目の前にありますか?

また、私はWindowsを使用しているので、答えがLinux/unixコマンドに対するシェルアウトである場合、それは私にとっては機能しません。

たとえば.NETにはDirectory.GetFiles()メソッドと別のDirectory.GetDirectories()メソッドがあるため、Rには類似のペアがあると考えました。前もって感謝します。

62
user297400

更新:A list.dirs関数は、リビジョン54353で基本パッケージに追加され、2011年4月のR-2.13.0リリースに含まれていました。

list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

そのため、以下の私の機能は数か月間しか役に立ちませんでした。 :)


これを行うためのベースR関数は見つかりませんでしたが、次を使用して独自のR関数を作成するのは非常に簡単です。

dir()[file.info(dir())$isdir]

更新:ここに関数があります(Timothy Jonesのコメントを修正しました):

list.dirs <- function(path=".", pattern=NULL, all.dirs=FALSE,
  full.names=FALSE, ignore.case=FALSE) {
  # use full.names=TRUE to pass to file.info
  all <- list.files(path, pattern, all.dirs,
           full.names=TRUE, recursive=FALSE, ignore.case)
  dirs <- all[file.info(all)$isdir]
  # determine whether to return full names or just dir names
  if(isTRUE(full.names))
    return(dirs)
  else
    return(basename(dirs))
}
88
Joshua Ulrich

base Rに list.dirs function なので、自家製のバリアントは必要ありません。

例えば:

list.dirs('.', recursive=FALSE)
25
jbaums

このスレッドを更新するだけです:

Rの新しいバージョン(現在2.5.1を使用しています)には、list.dirs基本インストールに含まれる機能:

list.dirsには暗黙的にall.files = TRUEがあり、再帰= TRUEの場合、答えにはパス自体が含まれます(読み取り可能なディレクトリである場合)。

16
Tal Galili
list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}

役に立つかもしれない?

これをどのように再帰的に行うことができますか? (recursivedir引数は、ディレクトリ名を返さず、各ディレクトリ内のファイルのみを返すなどの理由で、これらの関数を中断します...)。

8
Gavin Simpson

このようなものはどうですか、試してみてください:

dir('.')[file.info(dir('.',full.names=T))$isdir]
2
FranciscoA

Linux/UNIXコマンドにシェルアウトしたくないと言いますが、Windowsコマンドにシェルアウトしてもよいと思います。その場合、これはそれを行います:

Shell("dir/ad/b", intern = TRUE)

そして、これは再帰的にそれを行います:

Shell("dir/ad/b/s", intern = TRUE)

通常、ここでは他のプラットフォームに依存しないソリューションをお勧めしますが、特にできるだけ簡単かつ直接回答を得ることに関心があるインタラクティブな使用の場合、これはあまり手間がかかりません。

2
G. Grothendieck