私は特定のタスクで立ち往生しています。私が欲しいのは、ディレクトリ パスを指定すると、出力として再帰リストを返す関数です。
出力は myList$dir$subdir$subdir$fullFilePath の形式である必要があります
基本的に、ディレクトリツリーを特定のリストとして表現したいと考えています。すべてのファイルを取得し、各ファイルのすべてのサブディレクトリを取得しますが、複数のレベルを持つリストにすべてをスローする方法に行き詰まっています。
私は特定のタスクで立ち往生しています。私が欲しいのは、ディレクトリ パスを指定すると、出力として再帰リストを返す関数です。
出力は myList$dir$subdir$subdir$fullFilePath の形式である必要があります
基本的に、ディレクトリツリーを特定のリストとして表現したいと考えています。すべてのファイルを取得し、各ファイルのすべてのサブディレクトリを取得しますが、複数のレベルを持つリストにすべてをスローする方法に行き詰まっています。
再帰を使用した解決策は次のとおりです。
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
これは醜いハックです。
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)
ただし、この場合、答えを再考する必要があると思います。