web-dev-qa-db-ja.com

リストのリストをフラット化する方法は?

tmパッケージはcを拡張するため、PlainTextDocumentsのセットが指定された場合、Corpusが自動的に作成されます。残念ながら、各PlainTextDocumentは個別に指定する必要があるようです。

例えばもしわたしが持っていたら:

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

私はこれをしてCorpusを取得します:

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

次のような_'PlainTextDocument_ sのリストのリストがあります。

_> 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
_

したがって、すべてのPlainTextDocumentsをCorpusに入れるには、次のようにします。

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

誰でも簡単な方法を提案できますか?

ETA:foo<-unlist(foolist, recursive=FALSE)は、PlainTextDocumentsのフラットリストを生成しますが、リストごとの要素をcに渡すという問題が残ります。

59
dnagirl

unlist(foolist)が役立つと期待しています。オプションrecursiveがあり、デフォルトではTRUEです。

したがって、unlist(foolist, recursive = FALSE)はドキュメントのリストを返し、次の方法でそれらを結合できます。

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

do.callは、取得したリストの要素に関数cを適用するだけです

61
DrDom

リストが複数回ネストされ、ネストの量がリストの要素間で異なる場合のより一般的なソリューションは次のとおりです。

 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