comment aplatir une liste de listes en R

tm extension du paquet 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'ai eu:

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

je le ferais pour obtenir un Corpus:

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

j'ai une liste de listes de 'PlainTextDocuments 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 PlainTextDocumentdans un Corpus, ce serait travail:

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

quelqu'un Peut-il suggérer un moyen plus facile, s'il vous plaît?

ETA: foo<-unlist(foolist, recursive=FALSE) produit une liste plate de Plaintdocuments, ce qui me laisse toujours avec le problème d'alimenter un élément de liste par élément à c

39
demandé sur dnagirl 2013-04-30 16:49:16

2 réponses

je pense que unlist(foolist) va vous aider. Il dispose d'une option recursive qui est TRUE par défaut. Donc unlist(foolist récursive=FALSE) retourne la liste des documents, puis vous pouvez les combiner en

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

do.call applique juste la fonction c pour les éléments de la liste

49
répondu DrDom 2013-04-30 14:52:08

Voici une solution plus générale pour quand 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)
  }
}
7
répondu Michael 2017-03-24 01:37:28