2011-11-24 20 views
8

Tôi muốn viết một danh sách vào một tập tin văn bản, giữ nguyên tên.Viết danh sách vào một tập tin văn bản, giữ tên, R

này tương tự như R: Print list to a text file nhưng với những cái tên mà tôi muốn in ra cũng có, vào lúc bắt đầu của mỗi dòng:

> print(head(mylist,2)) 
$first 
[1] 234984 10354 41175 932711 426928 
$second 
[1] 1693237 13462 

mylist.txt 
first 234984 10354 41175 932711 426928 
second 1693237 13462 

Bất kỳ ý tưởng?

Rất cám ơn.

Trả lời

11

Chức năng cat sẽ in sang thiết bị (bảng điều khiển theo mặc định) và không thêm bất kỳ chú thích thông thường nào, nhưng không thể chấp nhận danh sách làm đối số, vì vậy mọi thứ cần phải là vectơ nguyên tử. deparse(substitute()) gambit là cách khôi phục tên các danh sách được chuyển đến một hàm. Chỉ cần sử dụng names(x) bên trong hàm không khôi phục tên của đối số ban đầu.

mylist <- list(first =c(234984, 10354, 41175, 932711, 426928), 
       second =c(1693237, 13462)) 
fnlist <- function(x){ z <- deparse(substitute(x)) 
         cat(z, "\n") 
         nams=names(x) 
        for (i in seq_along(x)) cat(nams[i], x[[i]], "\n")} 
fnlist(mylist) 
mylist 
second 234984 10354 41175 932711 426928 
first 1693237 13462 

Phiên bản này sẽ ra một tập tin (và bạn có thể thay thế "\ t" nếu bạn muốn các tab giữa tên và giá trị

fnlist <- function(x, fil){ z <- deparse(substitute(x)) 
         cat(z, "\n", file=fil) 
         nams=names(x) 
        for (i in seq_along(x)){ cat(nams[i], "\t", x[[i]], "\n", 
              file=fil, append=TRUE) } 
         } 
fnlist(mylist, "test") 
+0

Hoạt động hoàn hảo! Xấu hổ nó đòi hỏi nhiều mã hơn (so với viết mà không có tên). Cảm ơn nhiều! –

+0

Tôi chưa bao giờ tìm ra lý do tại sao hàm cat.list cũng không tồn tại. Tôi đoán nó được xem là bản chất cấp thấp và không thích hợp cho việc khái quát hóa. –

+0

Cũng lưu ý 'cat' không thể xử lý các đối tượng với lớp' language' hoặc 'call' (và có lẽ cả những người khác). –

6

Bạn có thể nhận được một vector của chuỗi bạn yêu cầu với:

sapply(names(mylist),function(x) paste(x,paste(mylist[[x]],collapse=" "))) 
            first 
"first 234984 10354 41175 932711 426928" 
            second 
        "second 1693237 13462" 

Sau đó, bạn có thể viết nó với write hoặc writeLines.

+0

Cũng tuyệt vời, và không có vòng lặp cần thiết, cảm ơn! :) –

0

Nếu bạn muốn lưu danh sách để sử dụng trong tương lai trong R, hãy xem xét gói rlist.

đặt:

library("rlist") 
list.save(mylist, "mylist.rds") 

Sau đó, bạn có thể khôi phục danh sách, bao gồm tên, với:

mylist <- list.load("mylist.rds") 

".rds" sẽ không đưa ra một tập tin văn bản nhưng sẽ hoàn toàn phục hồi. ".yaml" sẽ cung cấp tệp văn bản nhưng một số cấu trúc dữ liệu sẽ bị mất khi tải lại. ".json" gần như cho tốt nhất cả hai, mặc dù tệp văn bản có thể không đọc được và cấu trúc danh sách lồng nhau có thể được đơn giản hóa (ví dụ: list(1, 2, 3) sẽ trở thành một vector 1:3).

0

@ 42.

Để thêm vào 42 của câu trả lời (cần phải có được một lời nhận xét nhưng sau đó tôi không thể định dạng mã)

tôi cần phải in cũng là tên của phần tử của các vectơ trong danh sách, vì vậy tôi thêm vào dòng này trên báo cáo kết quả mèo, như sau:

mylist <- list(first =c(a = 234984, b = 10354, c = 41175, d = 932711, e = 426928), 
      second =c(A = 1693237, B = 13462)) 


fnlist <- function(x, fil){ z <- deparse(substitute(x)) 
cat(z, "\n", file=fil) 
nams=names(x) 
for (i in seq_along(x)){ 
    cat("", "\t", paste(names(x[[i]]), "\t"), "\n", file=fil, append=TRUE) 
    cat(nams[i], "\t", x[[i]], "\n", file=fil, append=TRUE) } 
} 
fnlist(mylist, "test") 

kết quả

mylist 
     a  b  c  d  e  
first 234984 10354 41175 932711 426928 
     A  B 
second 1693237 13462 
Các vấn đề liên quan