2013-04-30 35 views
34

tm包擴展爲c,因此,如果給定一組PlainTextDocument,它會自動創建一個Corpus。不幸的是,似乎每個PlainTextDocument都必須單獨指定。如何拼合R列表中的列表

例如如果我有:

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

我這樣做是爲了得到一個Corpus

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

我有'PlainTextDocument小號列表的列表,看起來像這樣:

> 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 

所以,爲了讓我所有的PlainTextDocument成爲Corpus,這將工作:

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

任何人都可以提出更簡單的方法嗎?

ETA:foo<-unlist(foolist, recursive=FALSE)產生PlainTextDocuments的平面列表,仍然給我留下了餵食由元素的列表元素來c

回答

46

我希望unlist(foolist)會幫助你的問題。它有一個選項recursive,默認爲TRUE。所以選擇不公開(foolist,遞歸= FALSE)將返回文件的列表,然後你可以通過

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

do.call只是應用功能c所獲得的列表中的元素

3

這裏是一個將它們組合爲更通用的解決方案時,列表被嵌套在多個時間和嵌套的量的列表的元件之間的不同:

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

只是爲了使此能更明顯易懂一點我就指出,使用類標識列表(xprime) [ 1] ==「list」)是必要的(而不是使用is.list),當你的嵌套對象是從列表繼承的類時注意is.list(data.frame(3))的計算結果爲TRUE) – Michael 2017-03-24 01:33:33

+0

也注意到這並不保留原始結構的順序 – Michael 2017-03-24 01:35:20