9

私は特定のタスクで立ち往生しています。私が欲しいのは、ディレクトリ パスを指定すると、出力として再帰リストを返す関数です。

出力は myList$dir$subdir$subdir$fullFilePath の形式である必要があります

基本的に、ディレクトリツリーを特定のリストとして表現したいと考えています。すべてのファイルを取得し、各ファイルのすべてのサブディレクトリを取得しますが、複数のレベルを持つリストにすべてをスローする方法に行き詰まっています。

4

3 に答える 3

7

再帰を使用した解決策は次のとおりです。

tree.list <- function(file.or.dir) {
    isdir <- file.info(file.or.dir)$isdir
    if (!isdir) {
        out <- file.or.dir
    } else {
        files <- list.files(file.or.dir, full.names   = TRUE,
                                         include.dirs = TRUE)
        out <- lapply(files, tree.list)
        names(out) <- basename(files)
    }
    out
}

私はここで小さなディレクトリでそれをテストしました

test.dir <- tree.list("./test")
test.dir
# $a
# $a$`1.txt`
# [1] "./test/a/1.txt"
# 
# $a$aa
# $a$aa$`2.txt`
# [1] "./test/a/aa/2.txt"
# 
# $b
# $b$`3.txt`
# [1] "./test/b/3.txt"

これがあなたのニーズに対して遅すぎる場合は、すべてのファイルを1回の呼び出しで読み込んでから、少し解析を行うことlist.filesを検討します。recursive = TRUE

于 2013-01-07T00:54:02.947 に答える
2

これは醜いハックです。

mypath <- 'a/b/c/d'


makelist <- function(filepath, fsep = '/'){

  unlisted <- unlist(strsplit(filepath, fsep))

  nsubs <- length(unlisted)

  mylistcall <- paste(paste(rep('list(', nsubs), unlisted, collapse = '='), 
    '= NULL', paste(rep(')', nsubs), collapse = ''))


  mylist <- eval(parse(text = mylistcall))
  return(mylist)
  }

makelist(mypath)

$a
$a$b
$a$b$c
$a$b$c$d
NULL   

思い出す

fortune(106)

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

ただし、この場合、答えを再考する必要があると思います。

于 2013-01-07T00:36:56.390 に答える