web-dev-qa-db-fra.com

Comment aplatir une liste de listes?

Le package tm étend c de sorte que, si on lui donne un ensemble de PlainTextDocuments, il crée automatiquement un Corpus. Malheureusement, il semble que chaque PlainTextDocument doit être spécifié séparément.

par exemple. si j'avais:

foolist <- list(a, b, c); # where a,b,c are PlainTextDocument objects

Je ferais cela pour obtenir un Corpus:

foocorpus <- c(foolist[[1]], foolist[[2]], foolist[[3]]);

J'ai une liste de listes de 'PlainTextDocument Qui ressemble à ceci:

> str(sectioned)
List of 154
 $ :List of 6
  ..$ :Classes 'PlainTextDocument', 'TextDocument', 'character'  atomic [1:1] Developing assessment models   Developing models
  .. .. ..- attr(*, "Author")= chr "John Smith"
  .. .. ..- attr(*, "DateTimeStamp")= POSIXlt[1:1], format: "2013-04-30 12:03:49"
  .. .. ..- attr(*, "Description")= chr(0) 
  .. .. ..- attr(*, "Heading")= chr "Research Focus"
  .. .. ..- attr(*, "ID")= chr(0) 
  .. .. ..- attr(*, "Language")= chr(0) 
  .. .. ..- attr(*, "LocalMetaData")=List of 4
  .. .. .. ..$ foo           : chr "bar"
  .. .. .. ..$ classification: chr "Technician"
  .. .. .. ..$ team          : chr ""
  .. .. .. ..$ supervisor    : chr "Bill Jones"
  .. .. ..- attr(*, "Origin")= chr "Smith-John_e.txt"

#etc., all sublists have 6 elements

Donc, pour obtenir tous mes PlainTextDocuments dans un Corpus, cela fonctionnerait:

sectioned.Corpus <- c(sectioned[[1]][[1]], sectioned[[1]][[2]], ..., sectioned[[154]][[6]])

Quelqu'un peut-il suggérer un moyen plus simple, s'il vous plaît?

ETA: foo<-unlist(foolist, recursive=FALSE) produit une liste plate de PlainTextDocuments, ce qui me pose toujours le problème de fournir un élément de liste par élément à c

59
dnagirl

J'espère que unlist(foolist) vous aidera. Il a une option recursive qui est TRUE par défaut.

Ainsi, unlist(foolist, recursive = FALSE) renverra la liste des documents, puis vous pourrez les combiner en:

do.call(c, unlist(foolist, recursive=FALSE))

do.call applique simplement la fonction c aux éléments de la liste obtenue

61
DrDom

Voici une solution plus générale lorsque les listes sont imbriquées plusieurs fois et que la quantité d'imbrication diffère entre les éléments des listes:

 flattenlist <- function(x){  
  morelists <- sapply(x, function(xprime) class(xprime)[1]=="list")
  out <- c(x[!morelists], unlist(x[morelists], recursive=FALSE))
  if(sum(morelists)){ 
    Recall(out)
  }else{
    return(out)
  }
}
20
Michael