2012-02-09 39 views
5

Tôi đang tìm cách sử dụng bất động sản trên màn hình của mình để xem xét một số danh sách đơn giản cạnh nhau. Tôi không cố gắng kết hợp chúng, một la cbind, nhưng tôi sẽ không quan tâm nếu một cấu trúc trung gian mới được tạo ra. Nhận ra, tất nhiên, một danh sách có thể có nhiều loại đối tượng khác nhau, mặc dù tôi gần như sẽ đảm bảo rằng danh sách của tôi có cùng cấu trúc; cảm thấy tự do để chèn "NA" hoặc "NULL" nếu cần thiết để làm cho mọi thứ hoạt động (hoặc tôi có thể tìm ra cách để giải quyết điều đó).Làm thế nào để hiển thị danh sách cạnh nhau trong R - một "cbind" cho danh sách?

Dưới đây là ba ví dụ liệt kê mà tôi muốn thử để hiển thị cạnh nhau:

l1 <- list(e1 = "R", e2 = list("statistics", "visualization"), e3 = 0) 
l2 <- list(e1 = "Perl", e2 = list("text processing", "scripting"), e3 = 0) 
l3 <- list(e1 = "Matlab", e2 = list("numerical computing", "simulation"), e3 = c("academic - unknown", "professional - unknown")) 

Nếu bạn có một màn hình rộng, có vẻ như một sự lãng phí để xem những mất quá nhiều chỗ đứng và rất ít phòng được sử dụng trên truy cập ngang. Nếu những danh sách này chỉ dài hơn một chút, tôi sẽ không thể nhìn thấy nhiều hơn 2 lần cùng một lúc mà không làm giảm phông chữ nhỏ.

Nếu nó làm cho nó dễ dàng hơn, các e3 mục trong l1l2 có thể "FOSS", để phù hợp với vectơ đặc trưng của l3$e3, nhưng mục tiêu thực sự là một vấn đề bố trí trong R console.

Một số giải pháp giao diện cụ thể ngây thơ bao gồm:

  • cháy lên nhiều trường hợp R, chia màn hình sử dụng GNU screenC-A |
  • Tìm hiểu ESS, và để cho sự kỳ diệu của Emacs giải quyết tất cả mọi thứ
  • Go qua lại với một trình soạn thảo văn bản khác (ví dụ: Notepad ++) và di chuyển khối văn bản theo cách thủ công

Các giải pháp không ngây thơ t mũ tôi đang cố gắng là:

  • Viết chúng vào tệp văn bản. Vấn đề ở đây là làm việc ra khoảng cách rộng cố định. Có lẽ read.fwf sẽ hữu ích. (Bạn có thể dừng nếu có lỗi nếu mục nhập vượt quá không gian được phân bổ hoặc để cắt bớt nội dung.)
  • Hãy thử thứ gì đó với gói reshape.
  • Có thể có gì đó liên quan đến xlsx, để tạo một nhóm ô, mỗi ô có mục nhập văn bản và sau đó cố gắng hiển thị ma trận ký tự lớn.

Có một số phương pháp khác sẽ hiệu quả hơn không? Một lần nữa, không có gì thực sự cần phải được kết hợp như một đối tượng, chỉ cần kết hợp trong hiển thị trực quan.


Cập nhật 1. Dưới đây là ví dụ sử dụng plyr. Kết quả được thừa nhận khá thô - tên của danh sách và danh sách các yếu tố đã không được bảo tồn Đó không phải là quá khó khăn để sửa chữa, nhưng tôi nghi ngờ nó có thể làm tốt hơn nhiều so với điều này. Tôi không sao với việc in ra các danh sách như R thường in chúng, nhưng tách cửa sổ theo một cách nào đó. Tôi có một sự nghi ngờ không dễ.

combineLists <- function(manyLists){ 
    library(plyr) 
    newLists <- list() 
    for(ixList in 1:length(manyLists)){ 
     tmpList <- lapply(manyLists[[ixList]], paste, sep = "", collapse = ", ") 
     tmpVec <- as.character(tmpList) 
     newLists[[ixList]] <- tmpVec 
    } 
    newDF <- t(ldply(newLists)) 
    return(newDF) 
} 

combineLists(list(l1, l2, l3)) 

Trả lời

5

Kết hợp một số capture.output, lapply, gsubformat vào một container. Sử dụng do.call làm tác nhân liên kết. Thêm paste vào khẩu vị. Hãy để nó nấu một lúc:

sidebyside <- function(..., width=60){ 
    l <- list(...) 
    p <- lapply(l, function(x){ 
     xx <- capture.output(print(x, width=width)) 
     xx <- gsub("\"", "", xx) 
     format(xx, justify="left", width=width) 
     } 
) 
    p <- do.call(cbind, p) 
    sapply(seq_len(nrow(p)), function(x)paste(p[x, ], collapse="")) 
} 

này sẽ chữa khỏi tất cả mọi thứ:

sidebyside(l1, l2, l3, width=30) 

[1] "$e1       $e1       $e1            " 
[2] "[1] R       [1] Perl      [1] Matlab          " 
[3] "                            " 
[4] "$e2       $e2       $e2            " 
[5] "$e2[[1]]      $e2[[1]]      $e2[[1]]           " 
[6] "[1] statistics    [1] text processing   [1] numerical computing       " 
[7] "                            " 
[8] "$e2[[2]]      $e2[[2]]      $e2[[2]]           " 
[9] "[1] visualization    [1] scripting     [1] simulation         " 
[10] "                            " 
[11] "                            " 
[12] "$e3       $e3       $e3            " 
[13] "[1] 0       [1] 0       [1] academic - unknown  professional - unknown" 
[14] "                            " 
+0

+1 Điều đó có vẻ tốt! – Iterator

+0

Câu trả lời của bạn là điều tôi hy vọng đạt được trong câu trả lời của R. James thực sự hấp dẫn hơn tôi mong đợi, nhưng giải pháp R cơ bản của bạn thắng giải "console" (so với an ủi ...). – Iterator

2

Đó không phải là một giải pháp rất sạch sẽ, nhưng bạn có thể chuyển đổi các danh sách này để chuỗi, đặt chúng trong hai tập tin riêng biệt, và gọi diff -y (hoặc bất kỳ ứng dụng tương tự) để hiển thị sự khác biệt giữa hai tệp. Cung cấp các cấu trúc rất giống nhau, chúng sẽ được căn chỉnh.

cat(capture.output(print(l1)), sep="\n", file="tmp1") 
cat(capture.output(print(l2)), sep="\n", file="tmp2") 
system("diff -y tmp1 tmp2") 
+0

+1 Tôi thích điều đó. Việc cho phép 'diff' quản lý việc trình bày song song là thông minh. Chức năng 'diff' khá hữu ích. Nếu người ta muốn mọi thứ, không khó để thêm vào trước mỗi dòng với mã thông báo duy nhất cho nguồn đó (tức là danh sách gốc). Tôi chỉ nghi ngờ rằng> 2 danh sách sẽ không hoạt động tốt như vậy. – Iterator

+0

Ý tưởng của bạn cũng có thể được mở rộng bằng cách sử dụng lệnh 'dán'. Tuy nhiên, chiều rộng của các tệp khác nhau làm cho kết quả bị lởm chởm. Điều này dẫn tôi trở lại để kết hợp mọi thứ thông qua R với một số loại cố định chiều rộng + chuỗi cắt ngắn/padding. Điều này vẫn sẽ sử dụng 'capture.output()', đó là một ý tưởng hay, và tập trung vào * display * hơn là việc sắp xếp lại các đối tượng danh sách. – Iterator

0

Tại sao không sử dụng unlist()? Và lừa chúng thành hàng?

for(x in 1:3) { 
print(rbind(unlist(get(paste("l",x,sep=""))))) 
} 

Bạn có thể thiết lập use.names=FALSE nếu bạn không thích những e1 e2, vv

+0

Thật thú vị, nhưng màn hình của tôi không * rộng *. :) Một số văn bản sẽ tràn qua. Việc lắp các cột này, thay vì các hàng, sẽ dễ xử lý hơn. – Iterator

+0

cbind() không hoạt động tốt nếu không có danh sách nếu bạn có vectơ> 1 trong mỗi phần tử. –

3

Bạn có thể sử dụng gplots::textplot:

library(gplots) 
textplot(cbind(l1,l2,l3)) 

Nó giúp để phóng to cửa sổ của bạn đầu tiên.

+0

+1 Điều đó cũng khá tốt - đó cũng là một màn hình rõ ràng, hữu ích. Các tùy chọn cho 'mar' và' cex' có vẻ tiện dụng. – Iterator

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