【问题标题】:How do I recursively work my way through a list?如何以递归方式遍历列表?
【发布时间】:2012-03-27 10:08:22
【问题描述】:

对特定 API 的函数调用会返回目录列表。我的函数调用如下所示:

dir_listing('folder_name')

我能够将结果强制转换为 data.frame,它看起来像这样:

name is_folder
foo          TRUE
bar          FALSE

我希望能够向我的函数添加一个选项,允许递归列出所有子文件夹和文件。类似dir_listing('folder_name', recursive = TRUE)

如果我在根文件夹上运行 dir_listing(),我可以使用以下方法子集作为目录的结果:

result <- dir_listing('root_folder')
folders_in_result <- subset(result, is_folder==TRUE)

然后我可以将folders_in_result 中的每个名称推送到dir_listing()。然后我必须查看每一个,看看它们是否有任何文件夹。什么是实现此操作的有效方法,以便我可以获得在给定文件夹下递归搜索的所有文件和文件夹的最终data.frame,直到找不到更多子文件夹或文件?

编辑:为清楚起见,问题完全重写。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您的意思并不完全清楚,因为result[result$is_collection,] 并不是什么东西。如果您想将列传递给函数,那么只需将向量 result$is_collection 或更好的 result[["is_collection"]] 发送给它,因为第二种形式更好地概括为将参数作为名称或值传递。如果您想一次发送一行,请发送result[result$name=="foo",]result[result$name=="bar", ] 或以编程方式使用sapply(或lapply)来执行此操作:

    sapply(row.names(result), function( x) { do_something_to( result[x, ] ) }
    

    或者

    sapply(result$name, function(x) { do_something_to( result[result$name==x, ] ) }
    

    'plyr' 包的评估规则有点不同,但在某些方面更宽松......沿着控制subset 的参数如何工作的规则。但是 ldply 函数实际上是 lapply(split( ... )) 范式的替代品,其中第二个参数由 . 函数处理以创建拆分规则。对了,有个函数叫.

    【讨论】:

    • result[result$is_collection,]result 的子集,其中is_collectionTRUE。我想我可以写一个subset 命令来避免混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2016-04-30
    • 2014-03-01
    • 2021-10-05
    • 2021-09-19
    相关资源
    最近更新 更多