我如何以递归方式处理列表?

时间:2012-03-10 00:36:25

标签: r plyr

对特定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,直到找不到更多子文件夹或文件?

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

1 个答案:

答案 0 :(得分: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( ... ))范例的替代,其中第二个参数由.函数处理以创建拆分规则。是的,有一个名为.的函数。