2013-04-30 28 views
34

Pakiet tm rozciąga się na c, więc jeśli poda zestaw PlainTextDocument s automatycznie tworzy Corpus. Niestety, wydaje się, że każdy PlainTextDocument musi być określony osobno.jak spłaszczyć listę list w R

np. gdybym miał:

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

bym to zrobić, aby uzyskać Corpus:

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

Mam listę wykazów 'PlainTextDocument s, który wygląda tak:

> 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 

Tak , aby uzyskać wszystkie moje PlainTextDocument s do Corpus, to działałoby:

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

Czy ktoś może zaproponować łatwiejszy sposób?

ETA: foo<-unlist(foolist, recursive=FALSE) tworzy płaską listę PlainTextDocuments, która pozostawia mnie z problemem karmienia element listy poprzez elementem c

Odpowiedz

46

Spodziewam się, że unlist(foolist) pomoże. Ma opcję recursive, która domyślnie jest TRUE. Więc nie wyświetlać na liście (foolist, rekurencyjne = FAŁSZ) zwróci listę dokumentów, a następnie można je połączyć przez

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

do.call tylko zastosowanie funkcji c do elementów otrzymanej listy

3

Oto bardziej ogólne rozwiązanie, gdy listy są zagnieżdżone kilka razy, a ilość gniazdowania różni się pomiędzy elementami list:

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) 
    } 
} 
+0

właśnie zrobić to nieco bardziej zrozumiały ja po prostu podkreślić, że listy identyfikujące za pomocą klasy (xprime) [ 1] == "lista") jest niezbędna (zamiast używać is.list), gdy zagnieżdżone obiekty należą do klas dziedziczących z list (tj. zauważ, że is.list (data.frame (3)) ocenia PRAWDA) – Michael

+0

również zauważ, że nie zachowuje to kolejności oryginalnej struktury – Michael