2012-02-09 14 views
5

Szukam używać ekranu nieruchomości, aby spojrzeć na kilka prostych list obok siebie. Nie próbuję ich łączyć, a la cbind, ale nie miałbym nic przeciwko stworzeniu nowej struktury pośredniej. Uświadom sobie oczywiście, że lista może mieć wiele różnych typów obiektów, chociaż prawie zagwarantuję, że moje listy mają te same struktury; nie przejmuj się wstawiać "NA" lub "NULL", jeśli to konieczne, aby wszystko działało (lub mogę wymyślić, jak to zaszkodzić).Jak wyświetlać listy obok siebie w R - "cbind" dla list?

Oto trzy przykład wymienia, że ​​chciałbym spróbować, aby wyświetlić obok siebie:

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")) 

Jeśli masz szeroki monitora, to wygląda jak odpady, aby zobaczyć te zajmują tyle pionowy pokój i tak mało miejsca na dostęp poziomy. Gdyby te listy były tylko trochę dłuższe, nie byłbym w stanie zobaczyć więcej niż 2 naraz, bez zmniejszania się do małej czcionki.

Jeśli to sprawia, że ​​łatwiej się e3 wpisy l1 i l2 może być "FOSS", aby dopasować wektorów charakter l3$e3, ale prawdziwym celem jest problemem układ w konsoli R.

Niektóre naiwne, rozwiązania interfejsowe specyficzne obejmują:

  • odpalić wiele wystąpień R, podzielony ekran za pomocą GNU screen i C-A |
  • Learn ESB i niech cud Emacs rozwiązać wszystko
  • Go tam iz powrotem z innym edytorem tekstów (np. Notepad ++) i ręcznie migrować bloki tekstu

Rozwiązania inne niż naiwne Czapka próbuję:

  • Napisz je do pliku tekstowego. Problem polega na opracowaniu odstępów o stałej szerokości. Może pomoże read.fwf. (W porządku jest zatrzymanie się z błędem, jeśli wpis przekroczyłby przydzieloną przestrzeń lub obcięłoby coś.)
  • Spróbuj czegoś z pakietem reshape.
  • Prawdopodobnie coś z udziałem xlsx, aby utworzyć grupę komórek, każdy z wpisami tekstowymi, a następnie spróbować wyświetlić dużą matrycę znaków.

Czy istnieją inne metody, które byłyby bardziej wydajne? Ponownie, nic tak naprawdę nie musi być łączone jako obiekt, po prostu połączone w wizualny wyświetlacz.


Aktualizacja 1. Oto przykład użycia numeru plyr. Wyniki są wprawdzie dość surowe - nazwy list i elementów list nie zostały zachowane To nie jest trudne do naprawienia, ale podejrzewam, że można zrobić o wiele lepiej. Nie mam nic przeciwko drukowaniu list, ponieważ R zwykle je drukuje, ale w pewien sposób oddziela okno. Mam podejrzenie, które nie jest łatwe.

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

Odpowiedz

5

łączenia niektórych capture.output, lapply, gsub i format do pojemnika. Użyj do.call jako agenta wiążącego. Dodaj paste do smaku. Niech parzyć przez chwilę:

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="")) 
} 

To wyleczy wszystko:

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 To wygląda dobrze! – Iterator

+0

Twoja odpowiedź jest tym, co miałem nadzieję uzyskać w bazie R. Odpowiedź Jamesa jest w rzeczywistości bardziej atrakcyjna, niż się spodziewałem, ale twoje podstawowe rozwiązanie R wygrywa nagrodę "konsola" (w przeciwieństwie do pocieszenia ...). – Iterator

2

To nie jest bardzo czyste rozwiązanie, ale można przekonwertować list do strun, umieścić je w dwóch oddzielnych plikach, i nazywają diff -y (lub jakiegokolwiek podobnego wniosku) aby wyświetlić różnice pomiędzy dwa pliki. Pod warunkiem, że struktury są bardzo podobne, zostaną wyrównane.

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 Podoba mi się to. Letting 'diff' zarządza prezentacją side-by-side jest sprytna. Funkcja 'diff' jest całkiem przydatna. Jeśli ktoś chciał wszystko, nie jest trudno przed każdym wierszem z tokena unikatowe dla tego źródła (tj. Oryginalnej listy). Podejrzewam tylko, że> 2 listy nie sprawdzą się tak dobrze. – Iterator

+0

Twój pomysł można również rozszerzyć za pomocą polecenia 'paste'. Jednak szerokość różnych plików sprawia, że ​​wyniki są poszarpane. To prowadzi mnie z powrotem do łączenia rzeczy przez R z pewnego rodzaju stałą szerokością + obcinanie/obcinanie ciągu. Będzie to nadal korzystało z 'capture.output()', co jest dobrym pomysłem i skupia się na * wyświetlaniu *, a nie na frazowaniu obiektów list. – Iterator

0

Dlaczego nie skorzystać unlist()? I oszukać je w rzędach?

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

Można ustawić use.names=FALSE jeśli nie lubią e1 e2 itp

+0

To interesujące, ale mój ekran nie jest * szeroki *. :) Część tekstu się rozleje. Dopasowanie tych kolumn, a nie wierszy, byłoby łatwiejsze do przetworzenia. – Iterator

+0

cind() nie działa zbyt dobrze z nielistą, jeśli masz wektory> 1 w każdym elemencie. –

3

Można użyć gplots::textplot:

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

Pomaga zmaksymalizować okno pierwszy.

+0

+1 To również całkiem dobrze - jest to również przejrzysty, przydatny wyświetlacz. Opcje 'mar' i' cex' wydają się być przydatne. – Iterator

Powiązane problemy