¿Cómo trabajo de forma recursiva a través de una lista?
Frecuentes
Visto 167 veces
0
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 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.
1 Respuestas
1
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas r plyr or haz tu propia pregunta.
result[result$is_collection,]
es un subconjunto deresult
dondeis_collection
isTRUE
. Supongo que podría haber escrito unsubset
comando para evitar la confusión. - mayasaura