Как отображать списки бок о бок в R - "cbind" для списков? - PullRequest
6 голосов
/ 09 февраля 2012

Я хочу использовать свой экран для просмотра нескольких простых списков рядом.Я не пытаюсь объединить их, а-ля cbind, но я бы не возражал, если бы была создана новая промежуточная структура.Поймите, конечно, что список может иметь много разных типов объектов, хотя я почти гарантирую, что мои списки имеют одинаковую структуру;не стесняйтесь вставлять «NA» или «NULL», если необходимо, чтобы все заработало (или я могу выяснить, как это исправить).

Вот три примера списка, которые я хотел бы попытаться отобразить рядомсторона:

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

Если у вас широкий монитор, то кажется, что он занимает столько вертикального пространства и так мало места, используемого при горизонтальном доступе.Если бы эти списки были немного длиннее, я бы не смог увидеть больше двух одновременно, не уменьшив их до мелкого шрифта.

Если это облегчает, записи e3 в l1 и l2 могут быть "FOSS", чтобы соответствовать символьным векторам l3$e3, но реальная цель - это проблема макета в консоли R.

Некоторые наивные, специфичные для интерфейса решения включают в себя:

  • Запустите несколько экземпляров R, разделите экран, используя GNU screen и C-A |
  • Изучите ESS, и пусть чудо Emacs решит все
  • Goвперед и назад с помощью другого текстового редактора (например, Notepad ++) и вручную переносите блоки текста

Не наивные решения, которые я пробую:

  • Запишите ихв текстовый файл.Проблема здесь заключается в том, чтобы определить интервал фиксированной ширины.Может быть, read.fwf поможет.(Можно останавливаться с ошибкой, если запись превысит выделенное пространство, или усекать что-либо.)
  • Попробуйте что-то с пакетом reshape.
  • Возможно, что-то, включающее xlsx, чтобы создать группу ячеек, каждая с текстовыми записями, а затем попытаться отобразить большую матрицу символов.

Существуют ли другие методы, которые были бы более эффективными?Опять же, на самом деле ничего не нужно комбинировать как объект, просто объединить на визуальном дисплее.


Обновление 1. Вот пример использования plyr.Результаты, по общему признанию, довольно грубые - названия списков и элементы списков не сохранились. Это не так уж сложно исправить, но я подозреваю, что это можно сделать намного лучше, чем это.Я в порядке с распечаткой списков, поскольку R обычно печатает их, но разделяя окно некоторым образом.У меня есть подозрение, что это нелегко.

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

Ответы [ 4 ]

5 голосов
/ 09 февраля 2012

Объедините немного capture.output, lapply, gsub и format в контейнер. Используйте do.call в качестве связующего агента. Добавить paste по вкусу. Дайте настояться некоторое время:

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

Это вылечит все:

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] "                                                                                                             "
3 голосов
/ 09 февраля 2012

Вы можете использовать gplots::textplot:

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

Это помогает увеличить ваше окно в первую очередь.

2 голосов
/ 09 февраля 2012

Это не очень чистое решение, но вы могли бы преобразовать списки в строки, поместите их в два отдельных файла, и позвоните diff -y (или любое подобное приложение) для отображения различий между двумя файлами. При условии, что структуры очень похожи, они будут выровнены.

cat(capture.output( print(l1) ), sep="\n", file="tmp1")
cat(capture.output( print(l2) ), sep="\n", file="tmp2")
system("diff -y tmp1 tmp2")
0 голосов
/ 09 февраля 2012

Почему бы не использовать unlist()? И обмануть их в ряды?

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

Вы можете установить use.names=FALSE, если вам не нравится e1, e2 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...