¿Cómo trabajo de forma recursiva a través de una lista?

Una llamada de función a una API específica devuelve una lista de directorios. Mi llamada de función se ve así:

dir_listing('folder_name')

Puedo forzar el resultado a un data.frame y se ve así:

name is_folder
foo          TRUE
bar          FALSE

Quiero poder agregar una opción a mi función que permita la lista recursiva de todas las subcarpetas y archivos. Algo como dir_listing('folder_name', recursive = TRUE)

Si corro dir_listing() en la carpeta raíz, puedo crear un subconjunto de los resultados que son directorios usando:

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

Entonces puedo insertar cada nombre folders_in_result a través de dir_listing(). Luego tendría que mirar cada uno para ver si tienen carpetas. ¿Cuál es una forma eficiente de lograr esta operación para poder obtener una data.frame de todos los archivos y carpetas buscados de forma recursiva en una carpeta determinada hasta que no se encuentran más subcarpetas o archivos?

EDITAR: Pregunta completamente reescrita para mayor claridad.

preguntado el 10 de marzo de 12 a las 00:03

1 Respuestas

No está exactamente claro a qué te refieres porque result[result$is_collection,] no es realmente nada. Si desea pasar la columna a una función, simplemente envíela el vector, result$is_collection o mejor result[["is_collection"]], ya que esa segunda forma se generaliza mejor para pasar el argumento como un nombre o un valor. Si desea enviar una fila a la vez, envíe result[result$name=="foo",] y result[result$name=="bar", ]o usar programáticamente sapply (o lapply) Para hacer eso:

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

Or

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

Las reglas de evaluación para el paquete 'plyr' son un poco diferentes, pero de alguna manera más permisivas ... en la línea de las reglas que gobiernan cómo los argumentos subset trabajo. Pero la función ldply es realmente un reemplazo de la lapply(split( ... )) paradigma, donde el segundo argumento es procesado por el . función para crear una regla de división. Correcto, hay una función llamada ..

respondido 10 mar '12, 03:03

result[result$is_collection,] es un subconjunto de result dónde is_collection is TRUE. Supongo que podría haber escrito un subset comando para evitar la confusión. - Maiasaura

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.