2013-04-30 55 views
34

Gói tm mở rộng c sao cho nếu được thiết lập PlainTextDocument s, nó sẽ tự động tạo Corpus. Thật không may, có vẻ như mỗi PlainTextDocument phải được chỉ định riêng.cách làm phẳng danh sách các danh sách trong R

ví dụ: nếu tôi có:

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

Tôi muốn làm điều này để có được một Corpus:

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

Tôi có một danh sách liệt kê của 'PlainTextDocument s trông như thế này:

> 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 

Vì vậy, , để có được tất cả PlainTextDocument s của tôi thành một Corpus, điều này sẽ hoạt động:

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

Có ai có thể đề xuất một cách dễ dàng hơn không?

ETA: foo<-unlist(foolist, recursive=FALSE) tạo ra một danh sách phẳng của PlainTextDocuments, mà vẫn để lại tôi với các vấn đề về ăn một yếu tố danh sách bởi yếu tố để c

Trả lời

46

Tôi hy vọng rằng unlist(foolist) sẽ giúp bạn. Tùy chọn này có một tùy chọn recursive theo mặc định là TRUE. Vì vậy, không công khai (foolist, đệ quy = FALSE) sẽ trả về danh sách các tài liệu, và sau đó bạn có thể kết hợp chúng bằng cách

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

do.call chỉ áp dụng cho các chức năng c đến các yếu tố của danh sách được

3

Dưới đây là một giải pháp tổng quát hơn cho thời điểm danh sách được lồng nhau nhiều lần và số lượng lồng nhau khác nhau giữa các phần tử trong danh sách:

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

chỉ để làm điều này dễ hiểu hơn, tôi sẽ chỉ ra rằng việc xác định danh sách bằng lớp (xprime) [ 1] == "danh sách") là cần thiết (thay vì sử dụng is.list) khi đối tượng lồng nhau của bạn là các lớp kế thừa từ danh sách (tức là lưu ý rằng is.list (data.frame (3)) đánh giá là TRUE) – Michael

+0

cũng lưu ý rằng điều này không giữ lại thứ tự cấu trúc ban đầu – Michael

Các vấn đề liên quan