2013-04-30 57 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