如何在R中并排显示列表 - 列表的"cbind"?

Ite*_*tor 6 r list object

我希望使用我的屏幕空间来并排查看几个简单的列表.我不打算将它们组合起来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"))
Run Code Online (Sandbox Code Playgroud)

如果你有一个宽大的显示器,看起来这些占用如此多的垂直空间并且在水平通道上使用的空间很小,这看起来很浪费.如果这些列表只是稍微长一点,我将无法一次看到超过2个,而不会缩小为小字体.

如果它更容易,e3条目l1l2可能"FOSS",以匹配字符向量l3$e3,但真正的目标是R控制台中的布局问题.

一些天真的,特定于接口的解决方案包括:

  • 启动多个R实例,使用GNU screen和分割屏幕C-A |
  • 学习ESS,让Emacs的奇迹解决所有问题
  • 使用另一个文本编辑器(例如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))
Run Code Online (Sandbox Code Playgroud)

And*_*rie 5

结合一些 capture.output,lapply,gsubformat放入容器中.用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=""))
}
Run Code Online (Sandbox Code Playgroud)

这将治愈一切:

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] "                                                                                                             "
Run Code Online (Sandbox Code Playgroud)